我是这个Django休息框架的新手,我正在尝试创建一个API。我的model.py如下所示
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)
和serializers.py看起来像
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')
因为我能够产生一个像结果
{
"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"
}
]
}
]
}
但我需要知道表单字段属于哪种字段类型。而且我不确定如何在JSON数据中引入字段类型。请指导我获得预期的结果。如果我应该改革数据模型以获得预期结果,请告诉我。
追溯:
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`.
在field_type
中添加FormFieldSerializer
字段为
class FormFieldSerializer(serializers.ModelSerializer):
form_field_options = FormFieldOptionsSerializer(many=True)
class Meta:
model = FormFields
fields = ('id', 'description', 'form_field_options','field_type')
这将返回FieldType
实例的PK。
如果要显示字符串表示形式,请使用下面的代码段
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')