在 django 模型中使用外键集 django rest framework

using foreign key set in django models django rest framework

我有一个有趣的问题。我在关系管理器中使用 ForeignKey 调用。 IE。如果我想要来自相关模型 hamsters 的所有对象,调用将是 hamsters_set

现在这是一个附加到序列化程序的工作模型,在此实现中一切正常。

class SearchCity(models.Model):
    city = models.CharField(max_length=200)

class SearchNeighborhood(models.Model):
    city = models.ForeignKey(SearchCity, on_delete=models.CASCADE)
    neighborhood = models.CharField(max_length=200)

class CityNeighborhoodReadOnlySerializer(serializers.ModelSerializer):
    searchneighborhood_set = SearchNeighborhoodSerializer(many=True, read_only=True)

    class Meta:
        model = SearchCity
        fields = ('pk','city','searchneighborhood_set')
        read_only_fields =('pk','city', 'searchneighborhood_set')

但是在我尝试做同样事情的这个新模型中,我得到了 attribute error

class Room(models.Model):
    venue = models.ForeignKey(Venue, on_delete=models.CASCADE)
    name = models.CharField(max_length=100, null=True, blank=True)
    online = models.BooleanField(default=False)
    description = models.CharField(max_length=1000, blank=True, null=True)
    privateroom = models.BooleanField(default=False)
    semiprivateroom = models.BooleanField(default=False)
    seatedcapacity = models.CharField(max_length=10, null=True, blank=True)
    standingcapacity = models.CharField(max_length=10, null=True, blank=True)
    minimumspend = models.PositiveSmallIntegerField(blank=True, null=True)
    surroundsoundamenity = models.BooleanField(default=False)
    outdoorseatingamenity = models.BooleanField(default=False)
    stageamenity = models.BooleanField(default=False)
    televisionamenity = models.BooleanField(default=False)
    screenprojectoramenity = models.BooleanField(default=False)
    naturallightamenity = models.BooleanField(default=False)
    wifiamenity = models.BooleanField(default=False)
    wheelchairaccessibleamenity = models.BooleanField(default=False)
    cocktailseatingseatingoption = models.BooleanField(default=False)
    classroomseatingoption = models.BooleanField(default=False)
    ushapeseatingoption = models.BooleanField(default=False)
    sixtyroundseatingoption = models.BooleanField(default=False)
    boardroomseatingoption = models.BooleanField(default=False)
    theaterseatingoption = models.BooleanField(default=False)
    hallowsquareseatingoption = models.BooleanField(default=False)

class RoomImage(models.Model):
    room = models.ForeignKey(Room, on_delete=models.CASCADE)
    order = models.PositiveSmallIntegerField(blank=True, null=True)
    imageurl = models.CharField(max_length=200, blank=True, null=True)


class RoomAndImageSerializer(serializers.ModelSerializer):
    roomimage_set = RoomImageSerializer(many=True)
    class Meta:
        model = Room
        fields = ('name', 'online', 'description','privateroom','semiprivateroom', 'seatedcapacity', 'standingcapacity','minimumspend','surroundsoundamenity','outdoorseatingamenity','stageamenity','televisionamenity','screenprojectoramenity','naturallightamenity','wifiamenity','wheelchairaccessibleamenity','cocktailseatingseatingoption', 'classroomseatingoption','ushapeseatingoption','sixtyroundseatingoption','boardroomseatingoption','theaterseatingoption','hallowsquareseatingoption','roomimage_set')

AttributeError: Got AttributeError when attempting to get a value for field roomimage_set on serializer RoomAndImageSerializer. The serializer field might be named incorrectly and not match any attribute or key on the QuerySet instance. Original exception text was: 'QuerySet' object has no attribute 'roomimage_set'.

这两个实现似乎是一样的,这很有趣。 谁能发现我做错了什么?

您需要将序列化程序设置为只读

class RoomAndImageSerializer(serializers.ModelSerializer):
    roomimage_set = RoomImageSerializer(many=True,read_only=True)
    class Meta:
        model = Room
        fields = ('name', 'online', 'description','privateroom','semiprivateroom', 'seatedcapacity', 'standingcapacity','minimumspend','surroundsoundamenity','outdoorseatingamenity','stageamenity','televisionamenity','screenprojectoramenity','naturallightamenity','wifiamenity','wheelchairaccessibleamenity','cocktailseatingseatingoption', 'classroomseatingoption','ushapeseatingoption','sixtyroundseatingoption','boardroomseatingoption','theaterseatingoption','hallowsquareseatingoption','roomimage_set')