我没有参加任何数据库课程。请原谅......
从Django Book教程,我们有一个书籍应用程序,最初有三个类(书籍,出版商和作者)。
class Book(models.Model):
title = models.CharField(max_length=100)
# categories = models.ManyToManyField(Category)
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher)
publication = models.DateField()
我们可以将书籍与许多作者匹配,而我们只能将书籍与出版商匹配。
一本书可以有几个类别,所以写上面我评论过的内容似乎很自然。
class Category(models.Model):
name = models.CharField(max_length=40)
第二次尝试:
我记得在某个地方读过这个(vaugly):创建BookCategories,它将Category作为ForeignKey。
Book --> --> BookCategories --> Categroy
(符号:双箭头= ManyToMany和单箭头= ForeginKey)
哪一个更好?如果没有,我该如何处理?我的逻辑缺陷在哪里?如果第二次尝试更好,那是什么原因?
非常感谢你。
答案 0 :(得分:1)
我相信你所描述的方法或多或少相同。多对多字段始终需要插页式或“直通”表来存储两种对象类型之间的链接。
在您描述的第一种方法中,Django将在您运行syncdb时自动创建直通表。在第二种方法中,您只是手动定义了该表(尽管如您所指定的那样,您将拥有一个冗余表)。第二种方法在某些情况下很有用,因为这意味着您不仅可以定义链接,还可以存储有关该链接的信息。在这种情况下,您可能会有一个字段,用于存储首次将图书添加到某个类别的时间或添加该图书的用户。
有关详细信息,请查看Django docs on many-to-many through tables。