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