如何使用 Django Rest Framework 将 serializer.data 移动到自定义实例(字段)中



我能够使用 django-rest-framework 获得下面的 JSON 结果。

{
    "id": 1,
    "fieldA": 1,
    "fieldB": 100
 },
 {
    "id": 2,
    "fieldA": 2,
    "fieldB": 101
 },
 {
    "id": 3,
    "fieldA": 1,
    "fieldB": 101
 }

我只想将结构更改为此。

{
    "typeA":      
       {
         "id": 1,
         "fieldA": 1,
         "fieldB": 100
       }
 },
 {
    "typeB":      
       {
         "id": 2,
         "fieldA": 2,
         "fieldB": 100,
       },
       {
         "id": 3,
         "fieldA": 1,
         "fieldB": 101,
       }
 }

typeA包括fieldB == 100的对象,typeB包括fieldB == 101的对象。

我可以在 views.py get_query_set()使用类似的Objects.filter()来处理结果。所以你不需要关心它。

我问题的关键是如何插入我的自定义字段名称并将结果移动到其子级别。目前,我想该解决方案将与构建序列化程序的create()update()函数有关。请给出任何提示或提示。

这是我 model.py 了解更多信息。

class Results(models.Model):
    fieldA = models.ForeignKey(Model)
    fieldB = models.ForeignKey(EplTeams, null=True)

views.py

class ResultsView(generics.ListAPIView):
    serializer_class = ResultSerializer
    def get_queryset(self):
        typeA = Results.objects.filter( fieldB=100 )
        typeB = Results.objects.filter( fieldB=101 )
        queryset = list( itertools.chain(typeA, typeB) )
        return queryset

serializers.py

class ResultSerializer(serializers.ModelSerializer):
    class Meta:
        model = Results
您可以使用

ListSerializer

在您的 serializers.py 中:

class CustomListSerializer(serializers.ListSerializer):
    def to_representation(self, data):
        resdata = []
        data1 = data.filter(fieldB=100)
        data2 = data.filter(fieldB=101)
        resdata.append({'typeA': super(CustomListSerializer, self).to_representation(data1)})
        resdata.append({'typeB': super(CustomListSerializer, self).to_representation(data2)})
        return resdata
class ResultSerializer(serializers.ModelSerializer):
    class Meta:
        model = Results
        list_serializer_class = CustomListSerializer

在此处了解有关 ListSerializer 的更多信息

最新更新