在Django Query中获取具有相似值的项目数的最有效方法

时间:2011-12-02 18:09:40

标签: django performance

我正在寻找计算以下内容的最快方法:

给出这样的Contact模型:

class Contact(basemodel):

    item = models.ForeignKey(Item)
    recipient = models.ForeignKey(User, )
    sender = models.ForeignKey(User, )

我正在寻找最快的查询来获取特定项目的发件人列表,其中包含他们为此场景设置的联系对象的数量。

我会得到像这样的发件人名单 发件人= Contact.objects.filter(item = self.item).values_list('sender',flat = True)

但我需要计算每个发件人在列表中的时间。

我确信有一种更清洁的方式。

1 个答案:

答案 0 :(得分:2)

首先,如果您的模型有两个具有相同关系的字段,则必须发送一个向后名称,即related_name,如下所示:

class Contact(basemodel):

    item = models.ForeignKey(Item)
    recipient = models.ForeignKey(User,related_name='recipient_contact' )
    sender = models.ForeignKey(User,related_name='sender_contact' )

之后要检索发件人列表,您可以在实际发件人(用户)中执行查询,只需注释计数:

User.objects.filter(sender_contact__item=self.item).annotate(count=Count('sender_contact'))

我想这会奏效!让我知道任何事情!