将Django模型从ForeignKey更改为ManytoMany,将获得select_related:'group'中给出的无效字段名称。选择是:用户

时间:2018-12-05 03:49:58

标签: django python-3.x django-models django-views django-urls

我想更改我的帖子模型。在我有一个非常简单的关系之前。有3个模型UserPostGroup。用户可以创建帖子,并且该帖子必须属于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'),

以下是错误 enter image description here

我尝试将select_related更改为prefetch_related,但问题仍然存在。我该如何解决

*******以下基于@Ruddra的解决方案*****

对不起,我相信这已基本解决。更改与选择相关的内容后,出现以下错误

enter image description here

我认为这可能与我的网上论坛网址有关,下面是我的网上论坛modelviewurl,它们很简单

模型

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'),

您认为我做错了什么

1 个答案:

答案 0 :(得分:1)

根据documentation

  

返回一个查询集,该查询集将“遵循” 外键关系,   在执行查询时选择其他相关对象数据。   这是性能的增强器,导致单个更复杂   查询,但意味着以后不再使用外键关系   需要数据库查询。

手段select_related仅适用于OneToOneForignKey关系。

在这里,您正在使用SelectRelatedMixin,它有select_related。在该字段中,有 group user 。那可能是造成问题的原因。而是像这样使用PrefethRelatedMixin

class PostDetail(PrefetchRelatedMixin, DetailView):
    model = Post
    prefetch_related = ('user', 'group')