【问题标题】:How do you filter on many-to-many relationships using classes (Python/Django)如何使用类(Python/Django)过滤多对多关系
【发布时间】:2016-11-09 14:43:33
【问题描述】:

我正在尝试过滤属于某个主题的帖子。正如您在我的模型中看到的那样,我有一个多对多的关系。问题是我不知道如何过滤。通常我会通过 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

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

【问题讨论】:

  • theme.post_set.all() 随时随地,更多信息请访问docs.djangoproject.com/en/1.10/topics/db/examples/many_to_many/…
  • @Bitonator 我假设我需要将查询集更改为 queryset = Theme.post_set.all() 。这给了我以下错误:type object 'Theme' has no attribute 'post_set'
  • 你需要清楚一点。什么查询集? 究竟是什么,您要过滤吗?不,Bitonator 不是这么说的:他说要使用theme.post_set.all(),其中theme 是Theme 的一个实例。
  • @DanielRoseman 我想要构建的是 /blog 页面上显示了几个主题。如果您单击其中一个主题,您应该会获得属于该主题的帖子列表。在后端,您可以将帖子分配给一个或多个主题。现在发生的情况是,因为我没有使用任何过滤器,所以无论您选择什么主题,都会显示所有帖子

标签: python django many-to-many


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2021-03-19
    • 2015-10-21
    • 2023-03-06
    • 2011-12-08
    相关资源
    最近更新 更多