我有以下型号:
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
s的列表,其中至少有一个连接(即hasTopics
返回true
)。在Django中,在
filter
表达式中使用实例方法是不可能的(也就是说,像TopicLabel.objects.filter(TopicLabel.hasTopics).order_by('order')
这样的方法是不可能的)。实现这种查询(最好独立于数据库)的正确方法是什么(Django风格)?
最佳答案
对于这种特定情况,根本不需要聚合函数。使用isnull
过滤器:
TopicLabel.objects.filter(connection_label__isnull=False)
对于确实需要聚合的情况,可以根据aggregation documentation中所述的注释进行筛选。