Reputation: 1188
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
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