DRF嵌套关系:related_name参数

时间:2018-08-21 12:22:46

标签: django django-rest-framework

在DRF文档中:

  

通常,您需要确保设置了适当的   关系上的related_name参数,您可以将其用作   字段名称。

     

如果您尚未为反向关系设置相关名称,   您需要使用自动生成的相关名称   字段参数。

“我的房间”模型具有以下特征:

hotel = models.ForeignKey(
    Hotel,
    related_name="%(class)s_rooms",
    verbose_name=u'Hotel') 

如何将其添加到酒店序列化程序? 我尝试过fields = ('room_set', ...),但得到

  

在/ api / hotel /上配置不正确字段名称room_set不是   对模型Hotel有效。

3 个答案:

答案 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)

模型类HotelRoom的相关名称解析为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_namehotel_rooms不会解析为room_rooms,而是解析为Roomrelated_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')