2016-11-09 67 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()