如何在django rest框架中序列化多个关系模型

问题描述 投票:1回答:1

我是这个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`.
django python-3.x django-rest-framework
1个回答
2
投票

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')
© www.soinside.com 2019 - 2024. All rights reserved.