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

Django中使用DRF创建Blog时同步创建关联Comment的属性错误如何解决

报错原因

Django 外键字段默认的反向关联名称为{小写从模型名}_set,你的Comment模型关联Blog后,Blog实例默认访问关联评论的属性是comment_set,但序列化器中声明了comments字段,序列化返回时Blog实例找不到对应属性就会抛出该错误。

仅通过queryset解决的方案

不需要修改模型、序列化器代码,只需要在视图层的Blog查询集使用Prefetch预取关联评论,并指定自定义属性名comments即可:

  1. 先导入依赖
from django.db.models import Prefetch
from .models import Blog, Comment
  1. 修改视图的queryset配置,示例为DRF ModelViewSet场景:
class BlogViewSet(viewsets.ModelViewSet):
    serializer_class = BlogSerializer
    # 核心修改:预取评论并赋值给comments属性
    queryset = Blog.objects.all().prefetch_related(
        Prefetch(
            'comment_set',
            queryset=Comment.objects.all(),
            to_attr='comments'
        )
    )

修改后查询出来的每个Blog实例都会自动带上comments属性,刚好匹配序列化器的字段定义,报错就会消失。


补充说明:你现有序列化器create方法里存在两个笔误,避免后续创建时报错可以同步调整

  • validated_comments = validated_data.pop('comments')不要拆成两行
  • bulk_create里的解包参数写错了,应该是**validated_comment(原代码多写了s)
    调整后参考:
def create(self, validated_data):
    validated_comments = validated_data.pop('comments')
    blog = Blog.objects.create(**validated_data)
    Comment.objects.bulk_create([
        Comment(**validated_comment, blog=blog) 
        for validated_comment in validated_comments
    ])
    return blog

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:33:01