2013-10-02 6 views
0

я следующие модели Django:Как фильтровать записи ManyToManyField?

class TopicLabel(models.Model): 
    name = models.CharField(max_length=256) 
    order = models.IntegerField(null=True, blank=True) 
    topics = models.ManyToManyField(Topic, through='TopicLabelConnection') 

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

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

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, который будет возвращать мне все темы в TopicLabel.topic коллекции, которые имеют Topic.visible = True.

Я хочу программировать Django эквивалент следующего запроса:

SELECT * 
FROM OPINIONS_TOPICLABELCONNECTION, OPINIONS_TOPIC 
WHERE (OPINIONS_TOPICLABELCONNECTION.topicId_id = OPINIONS_TOPIC.id) AND 
    (OPINIONS_TOPICLABELCONNECTION.labelId_id = X) AND 
    (OPINIONS_TOPIC.visible = 1) 

где X является первичным ключом теме этикетки.

Я попытался следующие определения методов и все они потерпели неудачу:

1)

class TopicLabel(models.Model): 
    [...] 
    def getVisibleTopics(): 
     return topics.filter(connection_topic__visible=True) 

2)

class TopicLabel(models.Model): 
    [...] 
    def getVisibleTopics(): 
     return topics.filter(visible=True) 

3)

class TopicLabel(models.Model): 
    [...] 
    def getVisibleTopics(): 
     return Topic.objects.filter(connection_label__visible=True).filter(connection_label__id=self.id) 

4)

class TopicLabel(models.Model): 
    [...] 
    def getVisibleTopics(): 
     return Topic.objects.filter(connection_label__visible=True).filter(connection_label__id=self.id) 

5)

class TopicLabel(models.Model): 
    [...] 
    def getVisibleTopics(): 
     return topics.filter(connection_topicId__visible=True) 

Что такое правильный код?

ответ

3

Во-первых, вы должны иметь self в качестве первого параметра метода. Затем отфильтруйте темы. попробуйте следующее:

class TopicLabel(models.Model): 
    [...] 
    def getVisibleTopics(self): 
     return self.topics.filter(visible=True) 

Кроме того, есть ли причина, по которой вы создаете пользовательскую таблицу? Это не похоже, что вы добавляете к нему дополнительные данные.

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