Django:ForeignKey和ManyToManyField之间的区别

4

我似乎对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)

以上两个哪一个是正确的?
2个回答

7

这两种方式完全等价。ManyToManyField会自动为您创建“through”表,唯一的区别是它允许您使用单个表达式访问所有论文的作者或所有作者的论文。


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         |

而"多对多"字段则创建一个类似下面的表格。
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           |

所以区别在于表名 app_paperauthorapp_paper_authors


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接