Django中使用DRF创建Blog时同步创建关联Comment的属性错误如何解决
报错原因
Django 外键字段默认的反向关联名称为{小写从模型名}_set,你的Comment模型关联Blog后,Blog实例默认访问关联评论的属性是comment_set,但序列化器中声明了comments字段,序列化返回时Blog实例找不到对应属性就会抛出该错误。
仅通过queryset解决的方案
不需要修改模型、序列化器代码,只需要在视图层的Blog查询集使用Prefetch预取关联评论,并指定自定义属性名comments即可:
- 先导入依赖
from django.db.models import Prefetch from .models import Blog, Comment
- 修改视图的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
相关产品推荐
相关产品推荐

