0

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

让我先给你基本的设置。我有一个名为的模型House,其中包含 pk 和 uuid 等值。我有第二个模型Citizen,它也有一个 pk 和一个 uuid。House并且Citizen彼此之间存在多对多关系。

我想要一个序列化程序,它只返回一个它的公民数组。

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

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)

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

如何在此处获取 UUID 数组?

4

2 回答 2

2

您可以像这样使用 SlugRelatedField:

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

阅读drf 文档以获取更多信息。

于 2018-08-22T14:36:01.197 回答
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:
        ...

您可以在此处阅读有关此内容的更多信息

于 2018-08-22T14:33:54.863 回答