【问题标题】:Denormalising field in djangodjango中的非规范化字段
【发布时间】:2010-09-13 19:58:26
【问题描述】:

我发现很难对 django 模型中的字段进行非规范化。我有:

class AnswerSet(models.Model):
    title = models.CharField(max_length=255)
    num_answers = models.PositiveIntegerField(editable=False, default=0)
    answers = models.ManyToManyField(Answer, through='AnswerSetAnswer')
    ...

class AnswerSetAnswer(models.Model):
    answer = models.ForeignKey(Answer)
    answer_set = models.ForeignKey(AnswerSet)
    ...

我希望 num_answers 包含集合中答案数量的计数。

如果最初有 5 个答案与 AnswerSet“食物”相关联,并且我编辑了一个答案使其与 AnswerSet“颜色”相关联,我如何重新计算 AnswerSet 中与“食物”相关的答案数量?所有信号似乎只发送新数据,所以我不能只覆盖保存方法。

我尝试过使用 m2m_changed 信号,但是当我通过管理表单编辑关系时它从未被调用过。

这是我的代码:

def update_answer_set_num_answers(sender, **kwargs):
    """
    Updates the num_answers field to reflect the number of answers
    associated with this AnswerSet
    """
    instance = kwargs.get('instance', False)

    print "no instance"              # never gets here

    if not instance:
        return

    action = kwargs.get('action')

    print "action: ", action

    if (action != 'pre_remove' and action != 'pre_add' and action != 'clear'):
        return

    reverse = kwargs.get('reverse')

    if reverse:
        answer_set = instance.answer_set
    else:
        answer_set = instance.answer_set
    num_answers = AnswerSetAnswer.objects.filter(answer_set=answer_set.id).count()

    if (action == 'pre_remove'):
        num_answers -= int(kwargs.get('pk_set'))
    elif (action == 'pre_add'):
        num_answers += int(kwargs.get('pk_set'))
    elif (action == 'clear'):
        num_answers = 0

    answer_set.num_answers = num_answers

    print 'n a: ', answer_set.num_answers
    answer_set.save()


m2m_changed.connect(update_answer_set_num_answers, \
  AnswerSet.answers.through, weak=False)

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    你真的需要去规范化吗?你可以用一个简单的聚合来计算它:

    from django.db.models import Count
    answersets = AnswerSet.objects.all().annotate(num_answers=Count('answers')
    

    【讨论】:

    • 是的,它会很方便。例如,我想显示 5 个随机答案集,它们都有 3 个答案。我希望有很多答案集,所以这将有助于扩大规模
    猜你喜欢
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2013-08-21
    • 2016-05-13
    • 2018-06-06
    • 2013-12-11
    • 1970-01-01
    • 2021-06-13
    相关资源
    最近更新 更多