首页 > 解决方案 > DRF Serializer 如何序列化我的数据并显示

问题描述

我有跟随序列化器我在序列化方面面临 Json 问题。我有一个名为 daniel james 的用户,他有多个学科,比如数学科学

这是我的模型。

class Result(BaseModel):
    semester_choices = (
        ('first', 'First'),
        ('second', 'Second'),
        ('third', 'Third'),
        ('fourth', 'Fourth'),
        ('fifth', 'Fifth'),
        ('sixth', 'Sixth'),
        ('seventh', 'Seventh'),
        ('eight', 'Eight'),
        ('all', 'All'),
    )
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    registration_number = models.CharField(null=True, blank=True, max_length=20)
    semester = models.CharField(max_length=50, choices=semester_choices, null=True, blank=True)
    gpa = models.CharField(max_length=20)
    subject = models.CharField(max_length=50)

serializers.py

 class ResultSerializer(serializers.ModelSerializer):
    class Meta:
        model = Result
        fields = '__all__'

class ListResultSerializer(ResultSerializer):
    user = serializers.CharField()
    semester = serializers.CharField()
    subject = serializers.SerializerMethodField()

class Meta(ResultSerializer.Meta):
    fields = (
        'user',
        'semester',
        'subject',
    )

def get_subject(self, instance):
    return SubjectSerializer(instance).data

这是我的SubjectSerializer

class SubjectSerializer(ResultSerializer):
    class Meta(ResultSerializer.Meta):
        fields = (
            'gpa',
            'subject'
        )

在我的views.py中我已经这样做了。

class ListResultView(rest_generics.ListAPIView, UserMixin):
    serializer_class = serializers.ListResultSerializer
    permission_classes = (AllowAny,)

    def get_object(self):
        return self.get_user()

    def get_queryset(self):
        return usecases.ListResultUseCase(
            user=self.get_user()
        ).execute()

我使用 usecases.py 过滤数据这里是进一步的代码

class ListResultUseCase:
    def __init__(self, user: User):
        self._user = user

    def execute(self):
        self._factory()
        return self._result

    def _factory(self):
        self._result = Result.objects.filter(user=self._user)

现在这是我现在从上面的代码中得到的 Json。

[
    {
        "user": "daniel james",
        "semester": "first",
        "subject": {
            "gpa": "a+",
            "subject": "maths"
        }
    },
    {
        "user": "daniel james",
        "semester": "first",
        "subject": {
            "gpa": "A",
            "subject": "data structures"
        }
    }
]

我希望我的 json 采用这种格式

 [
  {
    "user": "daniel james",
    "semester": "first",
    "subject": [
      {
        "gpa": "a+",
        "subject": "maths"
      },
      {
        "gpa": "A",
        "subject": "data structures"
      }
    ]
  }
]

对序列化程序有任何帮助吗?

标签: pythondjangodjango-rest-frameworkdjango-serializer

解决方案


您可以创建一个单独的序列化程序以与嵌套序列化程序一起使用。

class SubjectNestedSerializer(serializers.ModelSerializer):
    class Meta:
        model = Subject
        exclude = ['user']

附言

尝试像这样更改您的模型

class Semester(BaseModel):
    semester_choices = (
        ('first', 'First'),
        ('second', 'Second'),
        ('third', 'Third'),
        ('fourth', 'Fourth'),
        ('fifth', 'Fifth'),
        ('sixth', 'Sixth'),
        ('seventh', 'Seventh'),
        ('eight', 'Eight'),
        ('all', 'All'),
    )
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='semesters')
    registration_number = models.CharField(null=True, blank=True, max_length=20)
    semester = models.CharField(max_length=50, choices=semester_choices, null=True, blank=True)

class Subject(BaseModel):
    semester = models.ForeignKey(Semester, on_delete=models.CASCADE, related_name='semester_subjects')
    gpa = models.CharField(max_length=20)
    subject = models.CharField(max_length=50)

推荐阅读