Немодельное поле в 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.'