Django Rest API报错:UserRoom对象无'images'属性,无法获取JSON
问题原因及解决步骤
1. 核心错误:反向关联名称不匹配
你在UserRoomSer里定义了images字段,但UserRoom模型并没有这个属性。因为UserImg的外键name关联到UserRoom时,Django默认的反向关联名称是userimg_set,而非images,所以会触发找不到属性的报错。
2. 序列化器字段类型错误
你使用的RelatedField只能返回关联对象的主键或字符串标识,无法生成你期望的嵌套JSON结构,应该改用已定义好的UserImgSer作为嵌套序列化器。
3. 模型中的objects = None是错误写法
这会覆盖Django默认的模型管理器,导致ORM无法正常执行查询操作,必须删除。
修改后的完整代码:
models.py
class UserRoom(models.Model): # 删除错误的 objects = None category = [ # 修正拼写错误:categoty → category ('President Lux', 'President Lux'), ('Lux', 'Lux'), ('Double', 'Double'), ('Standard', 'Standard'), ] name = models.CharField(max_length=150, choices=category, verbose_name='Категория') room_num = models.CharField(max_length=150,verbose_name='Доступные номера для категории') about = models.TextField(verbose_name='Подробности') price = models.IntegerField(verbose_name='Цена') img360 = models.FileField(verbose_name='Фотография в 360') class Meta: verbose_name = 'Номер (About)' verbose_name_plural = 'Номера (About)' class UserImg(models.Model): # 删除错误的 objects = None # 添加related_name='images',指定反向关联名称为images name = models.ForeignKey(UserRoom, on_delete=models.CASCADE, verbose_name='img2', related_name='images') img = models.FileField(upload_to='User img', verbose_name='Фотография') class Meta: verbose_name = 'Фотографию' verbose_name_plural = 'Фотографии'
serializers.py
class UserImgSer(ModelSerializer): class Meta: model = UserImg fields = '__all__' class UserRoomSer(ModelSerializer): # 替换RelatedField为嵌套序列化器UserImgSer images = UserImgSer(many=True, read_only=True) class Meta: model = UserRoom fields = [ 'name', 'room_num', 'about', 'price', 'img360', 'images', ]
额外优化:提升查询性能
在视图中通过prefetch_related预加载关联的图片数据,避免N+1查询问题:
class UserRoomViewSet(ModelViewSet): permission_classes = [AllowAny] queryset = UserRoom.objects.all().prefetch_related('images') serializer_class = UserRoomSer
修改完成后,接口将返回你期望的JSON结构:每个UserRoom对象会包含对应的images数组,数组内是每张图片的详细信息。
内容的提问来源于stack exchange,提问作者Зуфар Тангрибергенов
相关产品推荐
相关产品推荐

