在DRF文档中:
通常,您需要确保设置了适当的 关系上的related_name参数,您可以将其用作 字段名称。
如果您尚未为反向关系设置相关名称, 您需要使用自动生成的相关名称 字段参数。
“我的房间”模型具有以下特征:
hotel = models.ForeignKey(
Hotel,
related_name="%(class)s_rooms",
verbose_name=u'Hotel')
如何将其添加到酒店序列化程序?
我尝试过fields = ('room_set', ...)
,但得到
在/ api / hotel /上配置不正确字段名称
room_set
不是 对模型Hotel
有效。
答案 0 :(得分:1)
使用 fields = ('modelname_rooms', ...)
假设您有一个模型类,
class Hotel(models.Model):
name = models.CharField(max_length=123)
class MyModel(models.Model):
hotel = models.ForeignKey(Hotel, related_name="%(class)s_rooms", verbose_name=u'Hotel')
并在您的HotelSerializer
中,
class HotelSerializer(serializers.ModelSerializer):
class Meta:
model = Hotel
fields = ("mymodel_rooms",)
也就是说,您必须在 _room
中添加前缀才能使用related_field
。这里的prefix
是模型类的名称,以lower case
字母表示。
答案 1 :(得分:0)
模型类Hotel
中Room
的相关名称解析为hotel_rooms
。如果要在您的序列化程序类中包括该关系,可以尝试执行以下操作:
class HotelSerializer(serializers.ModelSerializer):
# as of the updates based on your comments this may become obsolete
hotel_rooms = serializers.PrimaryKeyRelatedField(
many=True,
read_only=True
)
class Meta:
model = Hotel
fields = ('hotel_rooms',) # put all other fields you need
# add depth for displaying nested contents
depth = 1
更新:
我的第一句话有误。假设类别名称为related_name
,hotel_rooms
不会解析为room_rooms
,而是解析为Room
。 related_name
应该有意义,在这种情况下,hotel_rooms
或什至只是rooms
都是很有意义的。拥有酒店后,您可以查询酒店房间:
hotel = Hotel.objects.get(pk=1)
hotel.hotel_rooms.all() # or hotel.rooms.all()
您没有发现需要使用%(class)s_rooms
。在从其他模型类继承的抽象类中或在使用ContentType
框架(其中在声明related_name
时尚不知道实际类名)时使用抽象类是有意义的。
答案 2 :(得分:0)
太大,无法评论。但是您是否可以检查 related_name 似乎存在格式问题,除非您有意将其放置。
hotel = models.ForeignKey(
Hotel,
related_name="abcs_rooms", # update this line
verbose_name=u'Hotel')