Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:ForeignKey和ManyToManyField的区别_Django_Model_Foreign Keys_Many To Many - Fatal编程技术网

Django:ForeignKey和ManyToManyField的区别

Django:ForeignKey和ManyToManyField的区别,django,model,foreign-keys,many-to-many,Django,Model,Foreign Keys,Many To Many,我似乎对Django的外键和ManyToManyField感到困惑。假设我有以下两种模型: class Author(models.Model): name = models.CharField(...) class Paper(models.Model): title = models.CharField(...) 一篇论文可能有几个作者。我可以做以下任何一项: a) 在论文中添加作者字段,并将作者添加到论文实例: authors = models.ManyToMa

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

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

class Paper(models.Model):
    title = models.CharField(...)
一篇论文可能有几个作者。我可以做以下任何一项:

a) 在
论文
中添加
作者
字段,并将作者添加到
论文
实例:

    authors = models.ManyToManyFields(Author)
b) 或者,我可以创建另一个包含论文作者的模型:

class PaperAuthor(models.Model):
    paper = models.ForeignKey(Paper)
    author = models.ForeignKey(Author)

以上两项中哪一项是正确的?

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

在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\u paperauthorapp\u paperauthors