2016-11-09 71 views
0

我试图过滤属于某个主题的帖子。我可以在模型中看到多对多的关系。问题是我不知道如何过滤。通常情况下,我会通过ID来做到这一点,但那并不奏效。如何过滤使用类的多对多关系(Python/Django)

型号:

class Theme(models.Model): 
     title = models.CharField(max_length=200) 
     slug = models.SlugField(_('slug'), max_length=255, null=True, blank=True) 
     text = models.TextField() 
     created_date = models.DateTimeField(
      default=timezone.now) 
     image = FilerImageField() 

     def publish(self): 
      self.save() 

     def __unicode__(self): 
      return self.title 

    class Post(models.Model): 
     writer = models.ForeignKey(Author, blank=True, null=True) 
     title = models.CharField(max_length=200) 
     text = models.TextField() 
     created_date = models.DateTimeField(
      default=timezone.now) 
     published_date = models.DateTimeField(
      blank=True, null=True) 
     themes = models.ManyToManyField(Theme) 

     def publish(self): 
      self.published_date = timezone.now() 
      self.save() 

     def __unicode__(self): 
      return self.title 

浏览:

from .models import Theme, Post 
from django.views.generic import ListView, DetailView 


class ThemesOverview(ListView): 
    """ 
    Overview of all themes 
    """ 
    model = Theme 
    template_name = 'content/theme_list.html' 

    def get_queryset(self): 
     queryset = Theme.objects.all() 
     return queryset 


class ThemePostsOverview(ListView): 
    """ 
    Overview of all posts within a theme 
    """ 
    model = Post 
    template_name = 'content/theme_posts_list.html' 

    def get_context_data(self, **kwargs): 

     # Call the base implementation first to get a context 
     context = super(ThemePostsOverview, self).get_context_data(**kwargs) 

     slug = self.kwargs['theme'] 
     theme = Theme.objects.get(title=slug) 
     context['theme'] = theme 

     return context 

    def get_queryset(self): 
     queryset = Post.objects.all() 
     return queryset 

正如你可以看到我目前呈现的所有帖子,而不是只正如我们所说的属于主题

+0

'theme.post_set.all()'无论你需要它,更多的信息在https://docs.djangoproject.com/en/1.10/topics/db/examples/ many_to_many /#多对多关系 – Bitonator

+0

@Bitonator我假设我需要将查询集更改为'queryset = Theme.post_set.all()'。这给了我以下错误:'类型对象'主题'没有属性'post_set'' –

+0

你需要更清楚一点。什么queryset? *你究竟想要过滤什么?不,这不是Bitonator所说的:他说要使用'theme.post_set.all()',其中'theme'是Theme的一个实例。 –

回答

0

职位在评论中,您需要使用主题上的反向关系来过滤查询集。下面是这样做的一种方式:

class ThemePostsOverview(ListView): 
    model = Post 
    template_name = 'content/theme_posts_list.html' 

    def get_context_data(self, **kwargs): 
     context = super(ThemePostsOverview, self).get_context_data(**kwargs) 
     context['theme'] = self.theme 
     return context 

    def get_queryset(self): 
     slug = self.kwargs['theme'] 
     self.theme = Theme.objects.get(title=slug) 
     return self.theme.post_set.all()