如何使用 类 (Python/Django) 过滤多对多关系

How do you filter on many-to-many relationships using classes (Python/Django)

我正在尝试过滤属于特定主题的帖子。正如您在我的模型中看到的那样,我有一个多对多的关系。问题是我不知道如何过滤。通常我会通过 ID 这样做,但那没有用。

型号:

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

如您所见,我目前显示的是所有帖子,而不仅仅是属于该主题的帖子

正如我们在评论中所说,您需要使用主题上的反向关系来过滤查询集。这是一种方法:

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()