Django学习报错之Cannot assign ... must be a ... instance

在写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模型对数据库操作时,如有依赖关系,则参数的值也需要为一个对象,或查询到的外键是一个对象

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值