Reputation: 992
I'm new to this Django rest framework and I'm trying to create an API. My model.py looks like the following
class FieldTypes(models.Model):
field_type = models.CharField(max_length=255, null=False)
deleted = models.BooleanField(default=False)
class Forms(models.Model):
form_name = models.CharField(max_length=255, null=False)
deleted = models.BooleanField(default=False)
class FormFields(models.Model):
form = models.ForeignKey(Forms, related_name = 'form_fields', on_delete=models.CASCADE)
field_type = models.ForeignKey(FieldTypes, related_name = 'form_field_types', on_delete=models.CASCADE)
description = models.CharField(max_length=255, null=False)
deleted = models.BooleanField(default=False)
class FormFieldOptions(models.Model):
form_field = models.ForeignKey(FormFields, related_name = 'form_field_options', on_delete=models.CASCADE)
description = models.CharField(max_length=255, null=False)
deleted = models.BooleanField(default=False)
and the serializers.py looks like
class FormFieldSerializer(serializers.ModelSerializer):
form_field_options = FormFieldOptionsSerializer(many=True)
class Meta:
model = FormFields
fields = ('id', 'description', 'form_field_options')
class FormSerializer(serializers.ModelSerializer):
form_fields = FormFieldSerializer(many=True)
class Meta:
model = Forms
fields = ('form_name', 'form_fields')
class FieldTypeSerializer(serializers.ModelSerializer):
class Meta:
model = FieldTypes
fields = ('field_type')
with that i was able to produce a result a like
{
"form_name": "Ticket",
"form_fields": [
{
"id": 1,
"description": "Type",
"form_field_options": [
{
"id": 1,
"description": "Question"
},
{
"id": 2,
"description": "Incident"
},
{
"id": 3,
"description": "Problem"
},
{
"id": 4,
"description": "Task"
}
]
}
]
}
but i need to know which field type the form fields belongs to. And I'm not sure about how to bring field types in the JSON data. Kindly guide me to get the expected result. Please let me know if I Should reform the data models to get the expected result.
Traceback:
File "C:\Python\lib\site-packages\django\core\handlers\exception.py" in inner
34. response = get_response(request)
File "C:\Python\lib\site-packages\django\core\handlers\base.py" in _get_response
126. response = self.process_exception_by_middleware(e, request)
File "C:\Python\lib\site-packages\django\core\handlers\base.py" in _get_response
124. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Python\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view
54. return view_func(*args, **kwargs)
File "C:\Python\lib\site-packages\rest_framework\viewsets.py" in view
103. return self.dispatch(request, *args, **kwargs)
File "C:\Python\lib\site-packages\rest_framework\views.py" in dispatch
483. response = self.handle_exception(exc)
File "C:\Python\lib\site-packages\rest_framework\views.py" in handle_exception
443. self.raise_uncaught_exception(exc)
File "C:\Python\lib\site-packages\rest_framework\views.py" in dispatch
480. response = handler(request, *args, **kwargs)
File "C:\Python\lib\site-packages\rest_framework\mixins.py" in list
48. return Response(serializer.data)
File "C:\Python\lib\site-packages\rest_framework\serializers.py" in data
765. ret = super(ListSerializer, self).data
File "C:\Python\lib\site-packages\rest_framework\serializers.py" in data
262. self._data = self.to_representation(self.instance)
File "C:\Python\lib\site-packages\rest_framework\serializers.py" in to_representation
683. self.child.to_representation(item) for item in iterable
File "C:\Python\lib\site-packages\rest_framework\serializers.py" in <listcomp>
683. self.child.to_representation(item) for item in iterable
File "C:\Python\lib\site-packages\rest_framework\serializers.py" in to_representation
527. ret[field.field_name] = field.to_representation(attribute)
File "C:\Python\lib\site-packages\rest_framework\serializers.py" in to_representation
683. self.child.to_representation(item) for item in iterable
File "C:\Python\lib\site-packages\rest_framework\serializers.py" in <listcomp>
683. self.child.to_representation(item) for item in iterable
File "C:\Python\lib\site-packages\rest_framework\serializers.py" in to_representation
510. fields = self._readable_fields
File "C:\Python\lib\site-packages\django\utils\functional.py" in __get__
37. res = instance.__dict__[self.name] = self.func(instance)
File "C:\Python\lib\site-packages\rest_framework\serializers.py" in _readable_fields
376. field for field in self.fields.values()
File "C:\Python\lib\site-packages\rest_framework\serializers.py" in fields
363. for key, value in self.get_fields().items():
File "C:\Python\lib\site-packages\rest_framework\serializers.py" in get_fields
1045. source, info, model, depth
File "C:\Python\lib\site-packages\rest_framework\serializers.py" in build_field
1190. return self.build_unknown_field(field_name, model_class)
File "C:\Python\lib\site-packages\rest_framework\serializers.py" in build_unknown_field
1302. (field_name, model_class.__name__)
Exception Type: ImproperlyConfigured at /forms/
Exception Value: Field name `field_type` is not valid for model `FormFields`.
Upvotes: 0
Views: 841
Reputation: 88499
Add field_type
field in FormFieldSerializer
as
class FormFieldSerializer(serializers.ModelSerializer):
form_field_options = FormFieldOptionsSerializer(many=True)
class Meta:
model = FormFields
fields = ('id', 'description', 'form_field_options','field_type')
This will return the PK of FieldType
instance.
If you want to show the string representation, use below snippet
class FormFieldSerializer(serializers.ModelSerializer):
form_field_options = FormFieldOptionsSerializer(many=True)
field_type = serializers.CharField(source='field_type.field_type')
class Meta:
model = FormFields
fields = ('id', 'description', 'form_field_options', 'field_type')
Upvotes: 1