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_paperauthorapp_paper_authors 的名称。