什么是ForeignKey而不是ManyToManyField的优缺点

Somenxavier

在django教程中,它对民意调查结构进行了建模:

from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

但我总是想知道为什么它们不像ManyToMany关系那样实现:

from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    choices = models.ManyToManyField(Choice)

class Choice(models.Model):
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

优缺点都有什么?

常绿

我敢肯定,他们用一个ForeignKey(一对多)在本教程中关系,因为他们试图保持例子尽可能简单,只有两个型号:QuestionChoice注意,这votesChoice模型的一个字段,这使得显示投票结果非常简单。

如果在进行民意测验时,每个问题都有相同的选择(完全同意,有点同意等),那么ManyToMany关系可能是合适的。但这使事情变得更加复杂。您为ManyToMany关系建议的模型是:

from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    choices = models.ManyToManyField(Choice)

class Choice(models.Model):
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

但是,如果不进行一些更改,它将无法正常工作。votes仍然是Choice表格的一个字段,但是现在每个选择都适用于许多问题。您将能够看到“强烈同意”选择获得38票,但您无法确定选民同意哪些问题。为了能够正确地将选票制成表格,您必须执行以下操作

from django.db import models

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    choices = models.ManyToManyField('Choice', through='QuestionChoices')

class Choice(models.Model):
    choice_text = models.CharField(max_length=200)

class QuestionChoices(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice = models.ForeignKey(Choice, on_delete=models.CASCADE)
    votes = models.IntegerField(default=0)

现在,您可以准确地列出每个问题选择组合有多少人投票,但是它比较复杂并且不太适合入门教程。

使用您提出的ManyToMany模型,Django会QuestionChoices在幕后自动创建模型,但是为了将votes字段附加到该模型,您必须自己明确地进行建模

如果您有可以建模为OneToMany或ManyToMany的关系,则优缺点取决于您的特定应用程序。通常,您想使用最能真实反映现实情况的模型。但是,您还必须考虑如何更新和汇总数据,并尝试做出最佳折衷。根据我的经验,在很多情况下选择困难。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通过管道而不是 websocket 连接 Puppeteer 的优缺点是什么

来自分类Dev

FXML的优缺点是什么?

来自分类Dev

将整个文件读取为单个String而不是逐行读取有什么优缺点?

来自分类Dev

对数组而不是STL映射-可能吗?优缺点都有什么?

来自分类Dev

jumboMode(dexOptions)的优缺点是什么

来自分类Dev

不同动画机制的优缺点是什么

来自分类Dev

If和Inline if的优缺点是什么?

来自分类Dev

加密的Ubuntu安装的优缺点是什么?

来自分类Dev

访客行为模式的优缺点是什么?

来自分类Dev

voyager laravel 框架的优缺点是什么?

来自分类Dev

加载具有多个获取请求而不是一个获取请求的角度页面的优缺点是什么?

来自分类Dev

OcMock vs OcMockito-优缺点是什么

来自分类Dev

建立GCC:自举程序的优缺点是什么?

来自分类Dev

api版本控制方法的优缺点是什么

来自分类Dev

在不同的流程中运行服务的优缺点是什么?

来自分类Dev

用JS代码加载脚本的优缺点是什么

来自分类Dev

Hadoop HA QJM和NFS的优缺点是什么?

来自分类Dev

Eigen :: Ref <>与std :: reference_wrapper <>的优缺点是什么?

来自分类Dev

与Electron相比,Chrome Apps的优缺点是什么?

来自分类Dev

使用GenericForeignKey与多表继承与OneToOneField的优缺点是什么?

来自分类Dev

这些方法的优缺点是什么SQL Server繁琐的查询

来自分类Dev

在if语句的条件下使用括号的优缺点是什么?

来自分类Dev

在Perl中声明包版本方法的优缺点是什么?

来自分类Dev

结合使用jQuery UI和AngularJS的优缺点是什么?

来自分类Dev

deb vs. rpm的优缺点是什么?

来自分类Dev

在单独的分区上挂载各种目录的优缺点是什么?

来自分类Dev

RIA中单个/多个域服务的优缺点是什么?

来自分类Dev

每种USB磁盘格式的优缺点是什么?

来自分类Dev

在JS代码中加载脚本的优缺点是什么

Related 相关文章

  1. 1

    通过管道而不是 websocket 连接 Puppeteer 的优缺点是什么

  2. 2

    FXML的优缺点是什么?

  3. 3

    将整个文件读取为单个String而不是逐行读取有什么优缺点?

  4. 4

    对数组而不是STL映射-可能吗?优缺点都有什么?

  5. 5

    jumboMode(dexOptions)的优缺点是什么

  6. 6

    不同动画机制的优缺点是什么

  7. 7

    If和Inline if的优缺点是什么?

  8. 8

    加密的Ubuntu安装的优缺点是什么?

  9. 9

    访客行为模式的优缺点是什么?

  10. 10

    voyager laravel 框架的优缺点是什么?

  11. 11

    加载具有多个获取请求而不是一个获取请求的角度页面的优缺点是什么?

  12. 12

    OcMock vs OcMockito-优缺点是什么

  13. 13

    建立GCC:自举程序的优缺点是什么?

  14. 14

    api版本控制方法的优缺点是什么

  15. 15

    在不同的流程中运行服务的优缺点是什么?

  16. 16

    用JS代码加载脚本的优缺点是什么

  17. 17

    Hadoop HA QJM和NFS的优缺点是什么?

  18. 18

    Eigen :: Ref <>与std :: reference_wrapper <>的优缺点是什么?

  19. 19

    与Electron相比,Chrome Apps的优缺点是什么?

  20. 20

    使用GenericForeignKey与多表继承与OneToOneField的优缺点是什么?

  21. 21

    这些方法的优缺点是什么SQL Server繁琐的查询

  22. 22

    在if语句的条件下使用括号的优缺点是什么?

  23. 23

    在Perl中声明包版本方法的优缺点是什么?

  24. 24

    结合使用jQuery UI和AngularJS的优缺点是什么?

  25. 25

    deb vs. rpm的优缺点是什么?

  26. 26

    在单独的分区上挂载各种目录的优缺点是什么?

  27. 27

    RIA中单个/多个域服务的优缺点是什么?

  28. 28

    每种USB磁盘格式的优缺点是什么?

  29. 29

    在JS代码中加载脚本的优缺点是什么

热门标签

归档