2013-09-24 2 views
2

Я следующих моделей: (. Я е где hasTopics возвращает true.)Джанго запрос с агрегатной функцией

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 с, которые имеют, по меньшей мере, одно соединение.

AFAIK в Django невозможно использовать методы экземпляра в выражениях filter (то есть что-то вроде TopicLabel.objects.filter(TopicLabel.hasTopics).order_by('order') невозможно).

Каков правильный способ (Django-style) для реализации такого запроса (желательно без базы данных)?

+4

Не используйте 'count' для проверки существования. используйте 'queryset.exists()' insted. Это намного проще для вашей базы данных. 'count()' может быть вредным. – Pol

+0

Теперь действительно ответ на ваш вопрос, но если ваша модель TopicLabelConnection существует только для подключения двух других моделей, то вы, вероятно, можете использовать поле Django ManyToMany и создать для вас таблицы и управлять таблицами. –

ответ

3

Для этого конкретного случая вам вообще не нужна функция агрегации. Используйте isnull фильтр:

TopicLabel.objects.filter(connection_label__isnull=False) 

Для случаев, когда вам нужен агрегат, вы можете фильтровать по аннотациям, как описано в aggregation documentation.

Смежные вопросы