django中的非规范化场
我发现很难在django模型中对字段进行非规范化。我有:django中的非规范化场,django,django-models,Django,Django Models,我发现很难在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 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个答案最初与回答集“食物”关联,并且我编辑了一个答案,使其与回答集“颜色”关联,那么我如何重新计算带有“食物”的回答集中的答案数?所有信号似乎只发送新数据,所以我不能重写save方法
我尝试过使用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)
你真的需要去规范化吗?您可以使用简单的聚合进行计算:
from django.db.models import Count
answersets = AnswerSet.objects.all().annotate(num_answers=Count('answers')
是的,很方便。例如,我想显示5个随机答案集,它们都有3个答案。我希望有很多答案集,这将有助于扩大规模