Немодельное поле в Django ModelSerializer

class Form(models.Model):
        key = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)

class Answer(models.Model):
        form = models.ForeignKey(Form, on_delete=models.CASCADE, related_name='answers')
        answer = models.TextField()

class AnswerSerializer(serializers.ModelSerializer):
    form_key = serializers.UUIDField(write_only=True)

    class Meta:
        model = imported_models.Answer
        fields = ['id', "answer"]

class AnswerViewset(viewsets.ModelViewSet):
    queryset = imported_models.Answer.objects.all()
    serializer_class = imported_serializers.AnswerSerializer

    def perform_create(self, serializer):
      form_key = self.request.data.get('form_key')
      form = imported_models.Form.objects.filter(key=form_key).first()
      if not form:
        return Response(status=status.HTTP_400_BAD_REQUEST, data={"detail: Form is not found"})
      serializer.save(form=form)

Я хочу создать доступ на основе ответа на ключ формы. Поэтому мне нужно подтвердить, что form_key является действительным UUID ключом. Как я могу это сделать?

Пробовали ли вы использовать SlugRelatedField, но просто представить, что uuid key является slug? Я думаю, это должно сработать, поскольку это поле также уникально.

Использование "form" для имени может быть более понятным в коде, поскольку именно это представляет ключ. Когда сериализатор работает успешно, он возвращает объект Form в этом поле, и имя имеет больше смысла.

class AnswerSerializer(ModelSerializer):

    form = SlugRelatedField(
        queryset=Form.objects.all(),
        slug_field="key",
        help_text="uuid `key` to a row in the `form` table",
    )

    class Meta:
        model = Foo
        fields = ["form_key"]


ser = AnswerSerializer(data={"form": "051ef0e3-68ce-40fe-949d-823f8c171b31"})
ser.is_valid(raise_exception=True)
ser.validated_data["form"]
>>> Form Object

ser = AnswerSerializer(data={"form": "oops"})
ser.is_valid(raise_exception=True)
>>> '"oops" is not a valid UUID.'
Вернуться на верх