Как объединить похожие данные в настраиваемое поле с помощью сериализаторов в django-rest-framework? - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть API, который возвращает material_id, material_name и его store_id (внешний ключ) и store_name, а также имеет поисковый бэкэнд. Поэтому я хочу вернуть все material_name и material_id для одного ключевого материала и аналогичным образом все поля магазина в хранилище ключей.

Итак, я попробовал код ниже

class MaterialSuggestions(generics.ListAPIView):
    search_fields = ['name', 'shape', 'color', 'material_type', 
                     'surface_type', 'store__name']
    filter_backends = (filters.SearchFilter,)
    queryset = Material.objects.all()
    serializer_class = MaterialSuggestionsSerializer 



class MaterialSuggestionsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Material
        fields = ('material','store')


    material =  serializers.SerializerMethodField('get_material')
    store = serializers.SerializerMethodField('get_store')


    def get_material(self,obj):
        return {'material_id':obj.id,'material_name':obj.name}


    def get_store(self,obj):
        return {'store_id':obj.store.id,'store_name':obj.store.name}

, когда япозвоните в API, я получу что-то вроде этого:

    {
        "material": {
            "material_id": 14,
            "material_name": "test"
        },
        "store": {
            "store_id": 28,
            "store_name": "test1"
        }
    },
    {
        "material": {
            "material_id": 13,
            "material_name": "test3"
        },
        "store": {
            "store_id": 29,
            "store_name": "test2"
        }
    }
] 

Это то, что я в идеале хотел бы вернуть.

    {
        "material": [ {
                       "material_id": 14,
                       "material_name": "test"
                      },
                     {
                      "material_id": 13,
                      "material_name": "test3"
                     }         
                   ]


          "store": [  {
                       "store_id": 28,
                       "store_name": "test1"
                      },
                      {
                       "store_id": 29,
                       "store_name": "test2"
                      }
                  ]
    } 

или даже это было бы здорово

    {
        "material":  {
                       "material_id": 14,13
                       "material_name": "test","test3"
                      },       



          "store":   {
                       "store_id": 28,29
                       "store_name": "test1","test2"
                      },


    } 

Как бы мы манипулировали данными, которые мы возвращаем, с помощью сериализатора и как мы можем получить доступ к набору запросов, поступающему в сериализатор?

1 Ответ

0 голосов
/ 03 ноября 2019

Ваши желаемые результаты больше не являются моделями сериализаторов, так как, например, вы полностью теряете отношения между материалами и магазинами.

Вместо этого вам следует подумать о создании собственного словаря, затем преобразовать его в пользовательский json и просто передать в качестве ответа, как описано здесь: https://stackoverflow.com/a/35019122/12197595

...