SaimumIslam27
SaimumIslam27

Reputation: 1188

Non model field in 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)

I want to create Answer based access on form_key. So i need to validate form_key as valid UUID key. How can i do that?

Upvotes: 2

Views: 173

Answers (1)

Andrew
Andrew

Reputation: 8674

Have you tried using the SlugRelatedField, but just pretend that the uuid key is the slug? I think it should work for you since that field is also unique.

Using "form" for the name might be clearer in code, since that is what the key represents. When the serializer is successful it returns the Form object in that field, and the name makes more sense.

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.'

Upvotes: 1

Related Questions