我有以下型号:

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

在某个视图中,我想创建一个所有TopicLabels的列表,其中至少有一个连接(即hasTopics返回true)。
在Django中,在filter表达式中使用实例方法是不可能的(也就是说,像TopicLabel.objects.filter(TopicLabel.hasTopics).order_by('order')这样的方法是不可能的)。
实现这种查询(最好独立于数据库)的正确方法是什么(Django风格)?

最佳答案

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

TopicLabel.objects.filter(connection_label__isnull=False)

对于确实需要聚合的情况,可以根据aggregation documentation中所述的注释进行筛选。

10-08 05:07