You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中自动将评论的话题设置为与所属帖子的话题一致

问题原因

你视图函数入参pk是帖子的主键,直接用该值查询话题表匹配不到对应数据,评论的话题应该直接从你关联的帖子对象中获取,不需要单独查询。另外你的模型定义存在语法错误,会导致字段校验不通过。

修复步骤

1. 先修正models.py的错误

你comments模型的topics字段on_delete参数冲突,不能同时指定CASCADE和SET_NULL,如果需要保留评论在话题删除后仍存在,调整如下:

from django.db import models
from django.contrib.auth.models import User

# 你原有topic模型定义保持不变即可
class topic(models.Model):
    name = models.CharField(max_length=100)
    def __str__(self):
        return self.name

class comments(models.Model):
    # 修正on_delete参数,要允许空就用SET_NULL,不需要保留评论的话直接用CASCADE即可
    topics = models.ForeignKey(topic, on_delete=models.SET_NULL, null=True)
    created = models.DateTimeField(auto_now=True)
    posts = models.ForeignKey(post, on_delete=models.CASCADE)
    owner = models.ForeignKey(User, on_delete=models.CASCADE) # 补全models前缀
    comment = models.TextField(max_length=500)

    def __str__(self):
        return str(self.comment)

class post(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    Topic = models.ForeignKey(topic, on_delete=models.CASCADE)
    post = models.TextField(max_length=500)
    created = models.DateTimeField(auto_now=True)
    def __str__(self):
        return f'{self.post}'

修改完模型后执行python manage.py makemigrations和python manage.py migrate同步数据库结构。

2. 修正views.py的话题赋值逻辑

不要用post的id查询topic,直接从你获取的post对象中取关联的Topic字段赋值即可:

def comment(request, pk):
     # 提前获取对应帖子对象,避免重复查询
     target_post = post.objects.get(id=pk)
     form = commentform()
     context = {
          'form' : form
     }
     if request.method == 'POST':
          form = commentform(request.POST)
          if form.is_valid():
               forms = form.save(commit=False)
               forms.posts = target_post
               forms.owner = request.user
               # 直接从帖子关联属性取话题赋值
               forms.topics = target_post.Topic
               forms.save()
               return redirect('home')
     return render(request, 'base/comment.html', context)

扩展优化说明

如果后续需要查询特定帖子下的所有评论,不需要依赖评论的topics字段,直接通过post对象反向查询即可:

# 获取id为1的帖子下的所有评论
post_obj = post.objects.get(id=1)
comment_list = post_obj.comments_set.all()

内容的提问来源于stack exchange,提问作者Okafor Onyekachukwu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:54:05