【发布时间】: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