2013-09-30 3 views
0

я следующие модели:Джанго: Запрос с EXISTS или подзапрос

class Topic(models.Model): 
    title = models.CharField(max_length=140) 
    visible = models.NullableBooleanField(null=True, blank=True, default=False) 

    def __unicode__(self): 
     return self.title 
    class Meta: 
     verbose_name = _('topic') 
     verbose_name_plural = _('topics') 

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

    def getTopics(): 
     return TopicLabelConnection.objects.filter(labelId=self.id).orderby('order') 

    def __unicode__(self): 
     return self.name 


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 

Каждая тема может быть видимым или нет.

Мне нужно написать запрос, который возвращает все темы, имеющие хотя бы одну видимую тему.

Возможно ли создать такой запрос в Django без использования функции extra (инъекция SQL в код Django)? Если да, то как?

+0

@falsetru вы имели в виду 'TopicLabelConnection.objects.filter (connection_topic__visible = True)'? –

ответ

1

Использование TopicLabel.objects.filter(connection_label__topicId__visible=True).

Пример сеанса:

>>> t1 = Topic.objects.create(title='visible1', visible=True) 
>>> t2 = Topic.objects.create(title='visible2', visible=True) 
>>> t3 = Topic.objects.create(title='invisible1', visible=False) 
>>> t4 = Topic.objects.create(title='invisible2', visible=False) 
>>> tl1 = TopicLabel.objects.create(name='1') 
>>> tl2 = TopicLabel.objects.create(name='2') 
>>> tl3 = TopicLabel.objects.create(name='3') 
>>> TopicLabelConnection.objects.create(topicId=t1, labelId=tl1) 
>>> TopicLabelConnection.objects.create(topicId=t2, labelId=tl2) 
>>> TopicLabelConnection.objects.create(topicId=t3, labelId=tl3) 
>>> TopicLabelConnection.objects.create(topicId=t4, labelId=tl3) 

>>> TopicLabel.objects.filter(connection_label__topicId__visible=True) 
[<TopicLabel: 1>, <TopicLabel: 2>] 
Смежные вопросы