Django Rest Framework:仅获取ManyToMany关系的某些值

时间:2018-08-22 14:21:15

标签: django serialization django-rest-framework manytomanyfield django-related-manager

我正在使用Django Rest Framework编写我的API。我想在序列化器中写入与id(特别是uuid)不同的值。

首先让我给您基本设置。我有一个名为House的模型,除其他值外,还有一个pk和一个uuid。我还有一个名为Citizen的第二个模型,它也有一个pk和一个uuid。 HouseCitizen彼此之间具有ManyToMany关系。

我想拥有一个序列化器,该序列化器只返回其居民数组。

这是我尝试过(但失败)的无效伪代码:

class HouseSerializer(serializers.ModelSerializer):
    address = AddressSerializer()
    citizen = serializers.UUIDField(source="citizen.uuid")

    class Meta:
        model = Table
        fields = [
            "uuid",
            "address",
            "citizen",
            ...
        ]

此序列化器引发错误:

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

但是在我的House模型上,我明确地拥有citizen = models.ManyToManyField(Citizen)

如果我不指定任何序列化程序,而只将公民保留在fields数组中,那么我只会得到一个我无法使用的PK数组。

如何在这里获取UUID数组?

2 个答案:

答案 0 :(得分:2)

首先,您需要为Citizen模型使用一个序列化程序类。

class CitizenSerializer(serializers.ModelSerializer):
    uuid = serializers.UUIDField(read_only=True)

    class Meta:
        model = Citizen
        fields = ('uuid', )

然后,我们会将CitizenSerializer添加到您的HouseSerializer中。请注意,我们需要many=True关系的ManyToManyField参数。

class HouseSerializer(serializers.ModelSerializer):
    address = AddressSerializer()
    citizen = CitizenSerializer(read_only=True, many=True)

    class Meta:
        ...

您可以了解有关此here

的更多信息

答案 1 :(得分:1)

您可以像这样使用SlugRelatedField:

class HouseSerializer(serializers.ModelSerializer):
    address = AddressSerializer()
    citizen = serializers.SlugRelatedField( many=True,
    read_only=True,
    slug_field='uuid')

阅读drf doc以获得更多信息。