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

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,提问作者Зуфар Тангрибергенов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:45:49