django:如何使表的属性成为另一个表中的条目数

时间:2013-07-24 07:25:24

标签: django count

继续Django民意调查教程,我想在民意调查模型中输入一个条目(我称之为numChoices),该条目会自动更新与该民意调查相关的选择数量。我怎么能这样做?

class Poll(models.Model):
    question = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    numChoices = models.IntegerField()
    def __unicode__(self):
        return self.question
    def was_published_recently(self):
        now=timezone.now()
        return now-datetime.timedelta(days=1) <= self.pub_date < now
    was_published_recently.admin_order_field = 'pub_date'
    was_published_recently.boolean = True
    was_published_recently.short_description = 'Published recently?'

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
    def __unicode__(self):
        return self.choice_text

澄清,理想的用例是:

如果我只想列出所有与每个民意调查相关的选项数量的民意调查,则不必查询Choice表。

但是每次我添加一个选项时,与该选项相关联的投票条目都会更新它的numChoices计数

3 个答案:

答案 0 :(得分:2)

你不想那样。只需将它作为模型的属性即可。

class Poll(models.Model):
   ...
  @property
  def numChoices(self):
    return self.choice_set.count()

答案 1 :(得分:1)

将此信息存储在模型中是否至关重要?您只需执行以下操作即可获得模型的所有相关对象的计数:

count = poll_object.choice_set.count()

当您在两个模型之间有外键链接时,Django会自动为您创建“_set”(在本例中为choice_set)管理器。默认情况下,相关模型的名称将是模型名称的精简版本,因此模型poll_choice的默认相关名称将为“pollchoice_set”。您可以在定义FK字段时覆盖相关名称,例如

class Choice(models.Model):
    poll = models.ForeignKey(Poll, related_name="choices")

所以现在你会做

poll_object.choices.count()

获取相关选择对象的数量。

答案 2 :(得分:1)

如前面的答案中所提到的,您可以简单地使用@property,但每当您需要选择计数时,每次都会花费额外的数据库命中。例如,如果您想在单个页面上显示所有投票,其选项计数如下:

{% for poll in polls %}
    {{ poll.question }} - Choises: {{ poll.numChoices }}
{% endfor %}

它将为循环中的每个轮询命中数据库。因此,对于该简单操作,您将获得1 + COUNT(Polls.objects.all())查询。这就是为什么你可以在你的模型领域中存储选项,并添加另一种方法来更新选择计数:

class Poll(models.Model):
    choices_count = models.IntegerField()  # To store num of choices.        

    def update_choices_count(self):
        self.choices_count = self.choice_set.count()
        self.save()

创建轮询并添加一些选项后,您可以触发update_choices_count。这对于管理员在编辑民意调查时生成一些额外的SQL查询并不重要,但对于用户生成大量额外的数据库命中只是为了查看民意调查列表至关重要。