使用聚合函数进行Django查询

时间:2013-09-24 17:27:35

标签: python django

我有以下模特:

class TopicLabel(models.Model):
    name = models.CharField(max_length=256)
    order = models.IntegerField(null=True, blank=True)
    def __unicode__(self):
        return self.name

    def hasTopics():
        return TopicLabelConnection.objects.filter(labelId=self.id).count() > 0

class TopicLabelConnection(models.Model):
    topicId = models.ForeignKey(Topic, related_name='connection_topic')
    labelId = models.ForeignKey(TopicLabel, related_name='connection_label')

    def __unicode__(self):
        return self.labelId.name + ' / ' + self.topicId.title

在某个视图中,我想创建一个包含至少一个连接的所有TopicLabel的列表(即hasTopics返回true)。

AFAIK在Django中不可能在filter表达式中使用实例方法(即类似TopicLabel.objects.filter(TopicLabel.hasTopics).order_by('order')之类的东西是不可能的)。

实现此类查询的正确(Django风格)方式是什么(最好是与数据库无关)?

1 个答案:

答案 0 :(得分:4)

对于这种特定情况,您根本不需要聚合功能。使用isnull过滤器:

TopicLabel.objects.filter(connection_label__isnull=False)

对于需要聚合的情况,您可以按照aggregation documentation中的说明过滤注释。