简体   繁体   English

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

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

Im trying to filter posts belonging to a certain theme. 我试图过滤属于某个主题的帖子。 I have a many-to-many relationship as you can see in my models. 正如我在模型中看到的那样,我有很多对很多的关系。 The problem is that I don't know how to filter. 问题是我不知道如何过滤。 Normally I would do that by ID, but that didnt work. 通常我会通过ID来做到这一点,但这没有用。

Models: 楷模:

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

Views: 观看次数:

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

As you can see I'm currently showing all posts instead of only the posts that belong to the theme 如您所见,我当前正在显示所有帖子,而不是仅显示属于主题的帖子

As we said in the comments, you need to filter the queryset by using the reverse relation on the theme. 正如我们在评论中所说,您需要通过使用主题上的反向关系来过滤查询集。 Here's one way of doing that: 这是一种方法:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM