ValueError: Cannot assign "'2'": "Comment.article" must be a "Article" instance

报错中出现类似ValueError: Cannot assign "'XXX'": "Comment.article" must be a "XXX" instance时:

 

该错误通常是models.py里定义时以A_B的命名格式时会出现的问题

 

解决方案:只要将需要传参数的外键字段后直接加上_id即可

 

附上代码:

 

修改前:

models.py

# 文章评论表
class Comment(models.Model):
    user = models.ForeignKey(to='Userinfo')
    article = models.ForeignKey(to='Article')
    content = models.CharField(verbose_name='评论内容', max_length=255)
    comment_time = models.DateField(verbose_name='评论时间', auto_now_add=True)
    parent = models.ForeignKey(to='self', null=True)

    def __str__(self):
        return self.content

 

views.py

def comment(request):
    if request.is_ajax():
        back_dic = {'code': 10000, 'msg': ''}
        if request.method == 'POST':
            if request.user.is_authenticated():
                article = request.POST.get('article_id')
                content = request.POST.get('content')
                with transaction.atomic():
                    models.Article.objects.filter(pk=article_id).update(comment_num=F('comment_num')+1)
                    models.Comment.objects.create(user=request.user, article=article_id, content=content)
                back_dic['msg'] = '评论成功'
            else:
                 back_dic['code'] = 10001
                 back_dic['msg'] = '请先登录'
            return JsonResponse(back_dic)

 

修改后:

views.py

def comment(request):
    if request.is_ajax():
        back_dic = {'code': 10000, 'msg': ''}
        if request.method == 'POST':
            if request.user.is_authenticated():
                article_id = request.POST.get('article_id')
                content = request.POST.get('content')
                with transaction.atomic():
                    models.Article.objects.filter(pk=article_id).update(comment_num=F('comment_num')+1)
                    models.Comment.objects.create(user=request.user, article_id=article_id, content=content
                back_dic['msg'] = '评论成功'
            else:
                 back_dic['code'] = 10001
                 back_dic['msg'] = '请先登录'
            return JsonResponse(back_dic)

 

posted @ 2021-06-07 10:52  Jerry`  阅读(700)  评论(0编辑  收藏  举报