Django:非对称多对多关系

Django: Asymmetric ManyToMany Relation

我是 django 的新手,非常感谢您对以下问题的意见。

存在两个模型,即ABA 的实例必须至少属于 B 的一个实例,而 B 可以包含从 0 到无限的任意数量的 A 实例。

class A(models.Model):
  name = models.CharField(max_length = 128)
  created_date = models.DateTimeField(auto_now_add = True)
  modified_date = models.DateTimeField(auto_now = True)

class B(models.Model):
  name = models.CharField(max_length = 128)
  created_date = models.DateTimeField(auto_now_add = True)
  modified_date = models.DateTimeField(auto_now = True)
  A_list = models.ManyToManyField(A)

好的。我认为,根据我给出的描述,ManyToManyField 应该用于两个模型。问题是,据我所读,必须使用 blank = false 来防止 Anull 分配(因为 A 必须至少分配给一个 B) 但 B 可能没有分配的 A (因此不应该有 blank = false 语句。任何不对称的 ManyToMany 关系都可以在 djangoModel?

您应该将 ManyToManyField 放在 A 中,其中 null=Falseblank=False(默认情况下,您做对了)。这样,即使没有现有的 A 实例,您也可以毫无问题地创建 B 实例。

当您创建 A 的实例时,blank=False 确保 B_list 字段是必需的。 null=False 确保数据库不允许 NULL 值。

您的代码将变为:

class A(models.Model):
  name = models.CharField(max_length = 128)
  created_date = models.DateTimeField(auto_now_add = True)
  modified_date = models.DateTimeField(auto_now = True)      
  B_list = models.ManyToManyField('B')

class B(models.Model):
  name = models.CharField(max_length = 128)
  created_date = models.DateTimeField(auto_now_add = True)
  modified_date = models.DateTimeField(auto_now = True)

关于 Django 中 nullblank 的区别,请参见 post:

differentiate null=True, blank=True in django