Django DRF ResidenceSerializer报无hotel属性AttributeError问题求助
错误原因
你的报错根源是Residence模型的外键字段命名不符合Django的默认规则,和序列化器的字段名不匹配:
Django定义ForeignKey时,你设置的字段名就是实例访问关联对象的属性名,数据库会自动给该字段追加_id后缀作为存储列名。你现在把外键字段命名为hotel_id,那么Residence实例访问关联Hotel对象的属性就是hotel_id,但序列化器里声明的是hotel字段,自然找不到对应属性报错。
另外你设置的related_name='hotel'语义不合理,该参数是Hotel反向查询关联Residence时使用的属性名,命名为hotel会导致调用逻辑混淆。
解决方案
方案1(推荐,符合命名规范)
修改Residence模型的外键字段名,对齐Django默认开发规范:
class Residence(models.Model): # 外键字段名改为hotel,related_name改为语义匹配的residences hotel = models.ForeignKey(Hotel, on_delete=models.DO_NOTHING, related_name='residences') house_number = models.CharField()
修改完成后执行makemigrations和migrate同步数据库,原有序列化器无需修改即可正常运行。
方案2(无需修改模型,适配现有字段)
如果不想改动现有模型结构,可以给序列化器字段增加source参数指定取值来源:
class ResidenceSerializer(serializers.HyperlinkedModelSerializer): # source指定从residence实例的hotel_id属性取关联对象 hotel = HotelSerializer(source='hotel_id') class Meta: model = Residence fields = ['house_number', 'hotel']
内容的提问来源于stack exchange,提问作者user13066942
相关产品推荐
相关产品推荐

