在写django后台的时候,需要对数据模型进行操作,这是在写评论与子评论的代码片段。
class CommentsViews(View):
def post(self, request):
"""
3 个参数
新闻ID 评论内容 父评论ID
1,判断用户是否登录
2,获取参数
3,校验参数
4,保存到数据库
:param request:
:return:
"""
# 判断用户是否登录
if not request.user.is_authenticated:
return res_json(errno=Code.SESSIONERR, errmsg=error_map[Code.SESSIONERR])
# 获取数据
data = json.loads(request.body)
text = data.get('text') # 评论内容
commenter = data.get('commenter') # 评论人
news_id = data.get('news_id') # 新闻id
# 这两参数用户判断用户
# author_id = data.get('author_id') # 文章作者id
# author = data.get('author') # 文章作者
if not data:
return HttpResponseForbidden("数据丢失,请稍后重试!")
# 检验新闻是否已被删除
if not News.objects.only('id').filter(is_delete=False, id=news_id).exists():
return res_json(errno=Code.PARAMERR, errmsg=error_map[Code.PARAMERR])
if not all([text, commenter,news_id]):
return res_json(errno=Code.PARAMERR, errmsg=error_map[Code.PARAMERR])
if not text:
return res_json(errno=Code.NODATA, errmsg="评论内容不能为空")
# 回复评论
parent_id = data.get("parent_id")
if parent_id:# 如果存在上一级评论
if not Comments.objects.only('id').filter(is_delete=False, id=parent_id, news_id=news_id).exists():
return res_json(errno=Code.PARAMERR, errmsg=error_map[Code.PARAMERR])# 如果上一级评论刚好删除
# 保存数据
news_comment=Comments()
news_comment.content=text
news_comment.news_id=news_id
news_comment.author=commenter
news_comment.parent=parent_id if parent_id else None
news_comment.save()
return res_json(data=news_comment.to_dict_data())
刚开始直接这样写,以下语句出错
news_comment.author=commenter
news_comment.parent=parent_id if parent_id else None
报错翻译了一下,大概是接受的需要是实例对象,而不直接是某个值。
所以后来需要实例对象,就给他个实例对象吧,语句改成了:
news_comment.author=Users.objects.filter(username=commenter).first()
news_comment.parent=Comments.objects.filter(id=parent_id).first() if parent_id else None
程序正常运行。
后来了解到,因为我的models里面,有关这两个表名做了外键关联,如下:
class Comments(ModelBase):
"""
"""
content = models.TextField(verbose_name="内容", help_text="内容")
author = models.ForeignKey('users.Users', on_delete=models.SET_NULL, null=True)
news = models.ForeignKey('News', on_delete=models.CASCADE)
# 外键关联自己,使在同一条评论下可以追加评论
parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True)
class Meta:
ordering = ['-update_time', '-id']
db_table = "tb_comments" # 指明数据库表名
verbose_name = "评论" # 在admin站点中显示的名称
verbose_name_plural = verbose_name # 显示的复数名称
tb_comments表中的三个外键,在进行操作的时候,需要一个主键表的实例对象。
使用Django模型对数据库操作时,如有依赖关系,则参数的值也需要为一个对象,或查询到的外键是一个对象