2016-03-12 6 views
1

Скажем, у меня есть следующие модели:Как использовать ModelManager в поле Django ManyToMany?

class Poll(model): 
    title = models.CharField() 

class Option(model): 
    title = models.CharField() 
    polls = models.ManyToManyField(
     Poll, 
     through='PollOption', 
     null=True, 
     blank=True, 
     related_name='options' 
    ) 

class PollOptionManager(models.Manager): 
    use_for_related_fields = True 
    def get_queryset(self): 
     return super(PollOptionManager, self).get_queryset().filter(
      is_active=True 
     ) 

class PollOption(model): 
    poll = ForeignKey(Poll) 
    option = ForeignKey(Option) 
    is_active = BooleanField(default=True) 
    objects = PollOptionManager() 

При попытке запроса Poll.options.all() я все еще получаю Option случаи, для которых PollOption.is_active является False. Как я могу заставить диспетчера модели соответствующим образом фильтровать мои отношения ManyToMany на основе флага на поле through?

ответ

1

Проблема в том, что диспетчер сквозной модели (связанный) никогда не используется в вашем сценарии. Для того, чтобы использовать пользовательский менеджер, вы должны явно использовать его, например .:

class Poll(models.Model): 

    @property 
    def active_options(self): 
     return Option.objects.filter(id__in=self.polloption_set.values_list('option')) 

Здесь polloption_set отфильтровывает неактивные варианты, как предполагалось. Это, однако, делает менеджера бессмысленным, потому что вы можете просто добавить дополнительный фильтр в пользовательское свойство.

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

  • Нет связанных вопросов^_^