【发布时间】:2021-03-01 01:51:51
【问题描述】:
我正在制作一个网络应用程序,我希望在模型中使用多对多字段。我之前没有考虑太多,只是在模型中使用了多对多字段,但现在我在想这些多对多字段实际上如何存储在数据库中,在模型中使用多对多字段时最好的方法是什么。
方法一:
class Company(models.Model):
name = models.CharField(max_length = 190,blank = False,null = False)
about = models.CharField(max_length = 260,blank = False,null = True)
website = models.URLField(blank = False)
address = models.OneToOneField(Address,related_name="org_address",on_delete=models.SET_NULL,null=True)
admin = models.ManyToManyField(User,related_name="org_admin",blank = False)
created_on = models.DateTimeField(default = timezone.now)
updated_on = models.DateTimeField(default = timezone.now)
或 方法二:
class Company(models.Model):
name = models.CharField(max_length = 190,blank = False,null = False)
about = models.CharField(max_length = 260,blank = False,null = True)
website = models.URLField(blank = False)
address = models.OneToOneField(Address,related_name="org_address",on_delete=models.SET_NULL,null=True)
created_on = models.DateTimeField(default = timezone.now)
updated_on = models.DateTimeField(default = timezone.now)
class CompanyAdmin(models.Model):
admin = models.ManyToManyField(User,related_name="org_admin",blank = False)
company = models.ForeignKey(Company,related_name="company",on_delete=models.CASCADE)
这两种方法是否以相同的方式处理多对多字段?
我使用 MySQL 作为数据库
更新 “为了使它们等效,第二种方法应该具有 ForiegnKey 字段,而不是 多对多” 还要避免多个公司管理员条目字段公司应该是一对一的。
解决方案
不要创建连接表,因为 Django ORM 会自行处理。
【问题讨论】:
-
不,通过使用
CompanyAdmin您创建了一个额外的表,所以现在多对多关系使用两个中间表。它还导致您可以在多个CompanyAdmins 中添加相同的User,从而将其多次链接到相同Company。 -
为了使第二个示例等效,
CompanyAdmin中的admin必须是ForeignKey(而不是ManyToManyField) - 但 Django 的 ORM 的优点之一是你不需要不必自己创建这个中间“连接表”,所以我认为这样做没有任何好处。 -
好的,假设在第二种方法中使用一对一字段而不是外键。方法1不会也自动创建一个不同的表来处理多对多字段吗?
-
@RobinZigmond 谢谢,这就是我的想法。现在这清除了它。
-
@Dushyant Deshwal:即使你创建了一个
OneToOneField,它也会导致构建一个额外的表,这将导致查询时额外的JOIN,以及更多的磁盘使用。所以添加这样的额外模型不是一个好主意。