Django DRF获取博客列表时Field name字段无效错误求助
报错原因
你收到的Field name 'field_name' is not valid for model Model报错中,field_name实际对应tags,Model对应Post,核心问题是:
- 你在
Tag模型的多对多字段posts上设置的反向关联名为tags_posts,也就是说Post实例要获取关联的所有标签,需要调用post.tags_posts,但你在PostSerializer的Meta.fields里直接写了不存在的字段名tags,序列化器找不到Post模型上的对应字段,就抛出了该错误。
解决方案
你可以根据需求任选一种方案修复:
方案1:修改序列化器,适配现有反向关联名
如果不想改动模型代码,可以直接调整序列化器配置:
- 要么直接把fields里的
tags替换成实际的反向关联名tags_posts:
class PostSerializer(serializers.ModelSerializer): """Post Serializer""" owner = serializers.ReadOnlyField(source='owner.username') comments = serializers.PrimaryKeyRelatedField(many=True, read_only=True) class Meta: model = Post fields = ('id', 'title', 'body', 'owner', 'comments', 'tags_posts', )
- 要么显式声明
tags字段指定关联源,保持接口返回字段名不变:
class PostSerializer(serializers.ModelSerializer): """Post Serializer""" owner = serializers.ReadOnlyField(source='owner.username') comments = serializers.PrimaryKeyRelatedField(many=True, read_only=True) tags = serializers.PrimaryKeyRelatedField(many=True, read_only=True, source='tags_posts') class Meta: model = Post fields = ('id', 'title', 'body', 'owner', 'comments', 'tags', )
方案2:修改模型反向关联名,适配序列化器配置
如果不想改动序列化器代码,直接调整Tag模型的多对多字段配置即可:
class Tag(models.Model): """Tags model.""" name = models.CharField(max_length=100, blank=False, default='') owner = models.ForeignKey(User, related_name='tags_owner', on_delete=models.CASCADE) # 将related_name从tags_posts修改为tags posts = models.ManyToManyField('Post', related_name='tags', blank=True)
修改完成后执行以下命令生效模型变更:
python manage.py makemigrations python manage.py migrate
额外提示:如果修改后仍然报同类错误,逐一检查序列化器
fields列表里的所有字段,确认每个字段要么是Post模型自身声明的字段,要么是关联模型设置的反向关联名,不存在拼写错误、名称不匹配的情况,比如示例代码中的comments字段,也需要确认Comment模型里关联Post的外键的related_name是否为comments。
内容的提问来源于stack exchange,提问作者Lutaaya Huzaifah Idris
相关产品推荐
相关产品推荐

