我想更改我的帖子模型。在我有一个非常简单的关系之前。有3个模型User
,Post
和Group
。用户可以创建帖子,并且该帖子必须属于1组。
示例:用户Samir在Football上发表了一篇文章。该职位属于体育运动组。下面是模型的外观
早期型号:
class Post(models.Model):
user = models.ForeignKey(User, related_name='posts')
group = models.ForeignKey(Group, related_name='posts')
title = models.CharField(max_length=250, unique=True)
slug = models.SlugField(allow_unicode=True, unique=True, max_length=500)
message = models.TextField()
我要更改此设置,以便每个帖子最多可以属于3个群组,而最少可以属于1个群组。
下面是我的模特
class Post(models.Model):
user = models.ForeignKey(User, related_name='posts')
group = models.ManyToManyField(Group, related_name='posts', max_length=3)
title = models.CharField(max_length=250, unique=True)
slug = models.SlugField(allow_unicode=True, unique=True, max_length=500)
message = models.TextField()
帖子创建成功,但是没有重定向到帖子详细信息页面,并显示以下错误。同样在django管理员中,帖子组为空白。下面是我的DetailView
我的视图是:
from braces.views import SelectRelatedMixin
class PostDetail(SelectRelatedMixin, DetailView):
model = Post
select_related = ('user', 'group')
def get_queryset(self):
queryset = super().get_queryset()
return queryset.filter(user__username__iexact=self.kwargs.get('username'))
def get_context_data(self, **kwargs):
context = super(PostDetail, self).get_context_data()
return context
DetailView的我的网址是:
url(r'^(?P<username>[-\w]+)/(?P<slug>[-\w]+)/$', views.PostDetail.as_view(), name='single'),
我尝试将select_related
更改为prefetch_related
,但问题仍然存在。我该如何解决
*******以下基于@Ruddra的解决方案*****
对不起,我相信这已基本解决。更改与选择相关的内容后,出现以下错误
我认为这可能与我的网上论坛网址有关,下面是我的网上论坛model
,view
和url
,它们很简单
模型
class Group(models.Model):
name = models.CharField(max_length=250, unique=True)
description = models.TextField(default='', blank=True)
members = models.ManyToManyField(User, through='GroupMember')
视图是1个衬里
class GroupCreate(LoginRequiredMixin, CreateView):
model = Group
fields = ('name', 'description')
class GroupList(ListView):
model = Group
class GroupDetail(DetailView):
model = Group
最后,网址是
url(r'^posts/in/(?P<slug>[-\w]+)/$', views.GroupDetail.as_view(), name='single'),
您认为我做错了什么
答案 0 :(得分:1)
返回一个查询集,该查询集将“遵循” 外键关系, 在执行查询时选择其他相关对象数据。 这是性能的增强器,导致单个更复杂 查询,但意味着以后不再使用外键关系 需要数据库查询。
手段select_related
仅适用于OneToOne和ForignKey关系。
在这里,您正在使用SelectRelatedMixin,它有select_related
。在该字段中,有 group 和 user 。那可能是造成问题的原因。而是像这样使用PrefethRelatedMixin:
class PostDetail(PrefetchRelatedMixin, DetailView):
model = Post
prefetch_related = ('user', 'group')