Django与DRF中外键反向关联roomimage_set触发AttributeError求助
我之前也碰到过一模一样的情况,这种roomimage_set触发的AttributeError,大概率是这几个常见原因导致的,咱们逐个排查:
检查ForeignKey的
related_name配置
如果你在定义RoomImage的ForeignKey时指定了related_name参数,那默认的模型名_set就失效了。比如你写了:class RoomImage(models.Model): room = models.ForeignKey(Room, on_delete=models.CASCADE, related_name='images')那你就得用
room.images来访问关联对象,而不是room.roomimage_set。核对反向关联名的拼写和大小写
Django默认的反向关联名是全小写模型名 + _set,比如你的模型是RoomImage,那反向名就是roomimage_set(注意全小写,别写成RoomImage_set或者roomImage_set)。要是拼写错了,肯定会报属性不存在的错误。Serializer中字段名是否匹配
如果你用DRF的Serializer,要确保Serializer里声明的字段名和反向关联名完全一致。比如正确的写法应该是:class RoomSerializer(serializers.ModelSerializer): # 这里的字段名必须和反向关联名一致 roomimage_set = RoomImageSerializer(many=True, read_only=True) class Meta: model = Room fields = ['id', 'name', 'roomimage_set']要是这里写成了
room_images或者其他名字,就会触发AttributeError。先在Shell中验证关联是否正常
先脱离Serializer,直接在Django Shell里测试关联是否能正常访问:python manage.py shell然后执行:
from yourapp.models import Room room = Room.objects.first() print(room.roomimage_set.all())如果这里也报错,那说明是模型关联的问题,不是Serializer的问题;如果这里能正常返回QuerySet,那就是Serializer的配置出了问题。
确认关联方向是否正确
一定要确保RoomImage模型的ForeignKey是指向Room的,而不是反过来。比如正确的关联应该是:# RoomImage属于Room,所以ForeignKey在RoomImage里 class RoomImage(models.Model): room = models.ForeignKey(Room, on_delete=models.CASCADE) image = models.ImageField(upload_to='room_pics')要是把ForeignKey放在Room模型里指向RoomImage,那反向关联就不在Room上,自然找不到
roomimage_set。
内容的提问来源于stack exchange,提问作者user9487981

