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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:54:00