Python Django остальные рамки.Как сериализовать внешний ключ UUID в каком-то определенном формате? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть две модели A и B, и обе они имеют UUID в качестве первичных ключей.В B есть внешний ключ, связанный с A.

class A(models.Model):
    id = models.UUIDField(primary_key=True, editable=False)
    desc = models.CharField(max_length=128, null=True)

class B(models.Model):
    id = models.UUIDField(primary_key=True, editable=False)
    desc = models.CharField(max_length=128, null=True)
    for_key = models.ForeignKey(A, on_delete=models.SET_NULL, null=True)

И вот мой сериализатор,

class ASerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(format='hex')
    class Meta:
        model = A
        fields = ('id', 'desc')

class BSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(format='hex')
    class Meta:
        model = B
        fields = ('id', 'desc', 'for_key')

Как видите, я изменил uuid (первичный ключ) в шестнадцатеричном формате.Но формат for_key в формате по умолчанию (hex_verbose).Так как же мне сериализовать внешний ключ for_key в модели B в формат hex ?

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Если вы хотите указать for_key, вы не можете использовать ответ @ Withnail, потому что for_key есть только для чтения.Вы должны использовать PrimaryKeyRelatedField .

  class BSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(format='hex')
    for_key = serializers.PrimaryKeyRelatedField(queryset=A.objects.all())

    class Meta:
        model = B
        fields = ('id', 'desc', 'for_key')
0 голосов
/ 06 июня 2019

То, что вы ищете:

class BSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(format='hex')
    for_key = serializers.UUIDField(format='hex', source='for_key.id')
    class Meta:
      model = B
      fields = ('id', 'desc', 'for_key')
0 голосов
/ 06 декабря 2018

Когда вы сериализуете связь в DRF, вам просто нужно вызвать сериализатор во второй модели .

class ASerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(format='hex')
    class Meta:
        model = A
        fields = ('id', 'desc')

class BSerializer(serializers.ModelSerializer):
    id = serializers.UUIDField(format='hex')
    for_key = ASerializer(many=True, read_only=True)
    class Meta:
        model = B
        fields = ('id', 'desc', 'for_key')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...