【发布时间】:2018-12-05 03:49:58
【问题描述】:
我想更改我的帖子模型。之前我有一个非常简单的关系。有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 是
url(r'^posts/in/(?P<slug>[-\w]+)/$', views.GroupDetail.as_view(), name='single'),
你认为我做错了什么
【问题讨论】:
-
更改关系后,你的命令
makemigrations和migrate运行成功了吗? -
是的。他们成功运行
-
你能重新检查真实的数据库,有没有任何新表有 group_id 和 post_id ?该表将保留多对多的真实数据。您可以发布您的命令文件
makemigrations吗? -
仅供参考,
max_length对ManyToManyField没有影响 -
可能用
prefetch_related='posts'更改为PrefethRelatedMixin。因为你定义了related_name='posts'。
标签: django python-3.x django-models django-views django-urls