Возвращать список всех объектов при использовании метода Create в Serializer (Django Rest Framework) - PullRequest
0 голосов
/ 13 мая 2018

Привет, я хочу вернуть список dict объекта вместо созданного dict объекта при вызове метода create из serializers.ModelSerializer.

Я уже прочитал , каков поток управления django rest framework , из ответа, который я знаю, я могу переопределить метод to_representation, поэтому я возвращаю список объектов из метода create, затем в to_representation Я обрабатываю список объектов в списке словаря. как то так

#the data validation is for it has to be from create is omitted
def to_representation(self, datas):
    list_of_dict = []
    for data in datas:
        list_of_dict.append(data.__dict__)
    return list_of_dict

Я знаю, что изменил возвращаемое значение с dict на список dict, поэтому я прочитал исходный код и нашел свойство data, оно считывает данные из сериализатора и использует ReturnDict для возврата вывода. Я пытался переопределить свойство данных, но почему-то это не сработало.

@property
def data(self):
    ... reads the data from serializer field
    return ReturnList()

Извините, я вроде забыл полный код. Есть ли лучший способ решить эту проблему? Это требование как-то странно, но так оно и есть: *

Спасибо, что прочитали мой вопрос

UPDATE

Можно просто переопределить метод create в ModelViewSet представлениях. Это решило требование, но остается вопрос, знает ли кто-нибудь решение только из сериализатора.

def create(self, request, *args, **kwargs):
    super().create(request, *args, **kwargs)
    datas = Object.objects.all()
    result = []
    for data in datas:
        result.append(data.__dict__)
    serializer = self.get_serializer()
    headers = self.get_success_headers(serializer.data)
    return Response(result, status=status.HTTP_201_CREATED, headers=headers)

1 Ответ

0 голосов
/ 13 мая 2018

Я понял, что вам нужно вернуть ваш результат XYZ в виде списка, независимо от того, является ли это тип list или dict, верно?

Если такпереопределение метода to_representation() было бы лучше.def to_representation(self, instance): orginal_data = super().to_representation(instance) return [orginal_data]
Поведение вывода

{"key_1":"value_1","key_2":"value_2","key_3":"value_3"}  --->>> [{"key_1":"value_1","key_2":"value_2","key_3":"value_3"}]

[{"key":"value_1"},{"key":"value_2"},{"key":"value_3"}]  --->>> [[{"key":"value_1"},{"key":"value_2"},{"key":"value_3"}]]


Приведенный выше фрагмент всегда вернет list.Надеюсь, это то, что вы ищете:)

UPDATE-1
Можем ли мы попытаться сделать вывод в list после вызова свойства data?Я думаю, что это возможно.
Предположим, вы используете класс ModelViewSet, а затем следуйте фрагменту,

class SampleViewset(ModelViewSet):
    serializer_class = SampleSerializer
    queryset = SampleModel.objects.all()

    def list(self, request, *args, **kwargs):
        temp = super().list(request, *args, **kwargs)
        temp.data = [temp.data]
        return temp

    def retrieve(self, request, *args, **kwargs):
        temp = super().retrieve(request, *args, **kwargs)
        temp.data = [temp.data]
        return temp
...