Django:ForeignKey 和 ManyToManyField 之间的区别
Django: difference between ForeignKey and ManyToManyField
我好像对Django的ForeignKey和ManyToManyField有点困惑。假设我有以下两个模型:
class Author(models.Model):
name = models.CharField(...)
class Paper(models.Model):
title = models.CharField(...)
一篇论文可能有多个作者。我可能会执行以下任一操作:
a) 在 Paper
中添加 authors
字段并将作者添加到 Paper
实例:
authors = models.ManyToManyFields(Author)
b) 或者,我可以创建另一个包含论文作者的模型:
class PaperAuthor(models.Model):
paper = models.ForeignKey(Paper)
author = models.ForeignKey(Author)
以上两个哪个是正确的?
它们完全相同。 ManyToManyField 会自动为您创建 "through" table;唯一的区别是它使您能够通过一个表达式访问一篇论文的所有作者,或一个作者的所有论文。
在MySQL级,
Django 为多对多字段创建了一个单独的 table。
class PaperAuthor(models.Model):
paper = models.ForeignKey(Paper)
author = models.ForeignKey(Author)
tablename : app_paperauthor
select * from app_paperauthor;
| id | paper_id | author_id |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
并且多对多字段会创建一个 table,如下所示。
class Paper(models.Model):
title = models.CharField(...)
authors = models.ManyToManyField(Author)
tablename : app_paper_authors
select * from app_paper_authors;
| id | paper_id | author_id |
| 1 | 1 | 1 |
| 2 | 1 | 2 |
所以区别是 table app_paperauthor 和 app_paper_authors 的名称。
我好像对Django的ForeignKey和ManyToManyField有点困惑。假设我有以下两个模型:
class Author(models.Model):
name = models.CharField(...)
class Paper(models.Model):
title = models.CharField(...)
一篇论文可能有多个作者。我可能会执行以下任一操作:
a) 在 Paper
中添加 authors
字段并将作者添加到 Paper
实例:
authors = models.ManyToManyFields(Author)
b) 或者,我可以创建另一个包含论文作者的模型:
class PaperAuthor(models.Model):
paper = models.ForeignKey(Paper)
author = models.ForeignKey(Author)
以上两个哪个是正确的?
它们完全相同。 ManyToManyField 会自动为您创建 "through" table;唯一的区别是它使您能够通过一个表达式访问一篇论文的所有作者,或一个作者的所有论文。
在MySQL级,
Django 为多对多字段创建了一个单独的 table。
class PaperAuthor(models.Model):
paper = models.ForeignKey(Paper)
author = models.ForeignKey(Author)
tablename : app_paperauthor
select * from app_paperauthor;
| id | paper_id | author_id |
| 1 | 1 | 1 |
| 2 | 2 | 2 |
并且多对多字段会创建一个 table,如下所示。
class Paper(models.Model):
title = models.CharField(...)
authors = models.ManyToManyField(Author)
tablename : app_paper_authors
select * from app_paper_authors;
| id | paper_id | author_id |
| 1 | 1 | 1 |
| 2 | 1 | 2 |
所以区别是 table app_paperauthor 和 app_paper_authors 的名称。