Django:ForeignKey 和 ManyToManyField 之间的区别

Ran*_*ang 4 django many-to-many model foreign-keys

我似乎对 Django 的 ForeignKey 和 ManyToManyField 感到困惑。假设我有以下两个模型:

class Author(models.Model):
    name = models.CharField(...)

class Paper(models.Model):
    title = models.CharField(...)
Run Code Online (Sandbox Code Playgroud)

一篇论文可能有多个作者。我可以执行以下任一操作:

a)authors在实例中添加字段Paper并将作者添加到Paper实例中:

    authors = models.ManyToManyFields(Author)
Run Code Online (Sandbox Code Playgroud)

b) 或者,我可以创建另一个包含论文作者的模型:

class PaperAuthor(models.Model):
    paper = models.ForeignKey(Paper)
    author = models.ForeignKey(Author)
Run Code Online (Sandbox Code Playgroud)

以上两个哪个是正确的?

Dan*_*man 5

这些是完全等效的。ManyToManyField 会自动为您创建“直通”表;唯一的区别是它使您能够使用单个表达式访问一篇论文的所有作者,或一位作者的所有论文。


Sup*_*ova 5

在MySQL级别,

Django 为多对多字段创建一个单独的表。

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         |
Run Code Online (Sandbox Code Playgroud)

多对多字段创建一个如下表。

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           |
Run Code Online (Sandbox Code Playgroud)

所以区别在于表app_paperauthorapp_paper_authors的名称。