我有以下模特:
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风格)方式是什么(最好是与数据库无关)?
答案 0 :(得分:4)
对于这种特定情况,您根本不需要聚合功能。使用isnull
过滤器:
TopicLabel.objects.filter(connection_label__isnull=False)
对于需要聚合的情况,您可以按照aggregation documentation中的说明过滤注释。