2015-12-27 4 views
1

Я могу получить результат JSON ниже, используя django-rest-framework.Как перенести serializer.data в пользовательский экземпляр (поле) с Django Rest Framework

{ 
    "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.

Я могу обрабатывать результаты, используя Objects.filter() по адресу get_query_set() в views.py. Поэтому вам не нужно заботиться об этом.

Ключом моего вопроса является то, как я могу вставить свое настроенное имя поля и перенести результаты на его дочерний уровень. В настоящее время, я думаю, решение будет связано с 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 
+0

спасибо, Кевин. –

ответ

1

Вы можете сделать это с помощью 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 here

+0

большое спасибо. Ваш код работает почти, за исключением 'data.filter()'. когда я использовал 'data.filter (fieldB = 100)' или 'data.filter (data.fieldB = 100)' или 'data.filter (data ['fieldB'] = 100)', мой AWS-сервер возвращает 500 внутренних серверов ошибка. Поэтому я подтвердил, что тип данных является объектом. Я предполагаю, что это своего рода объект JSON. Чтобы решить эту проблему, я заменяю 'data.filter (fieldB = 100)' на '[d для d в данных, если d.fieldB == 100]', тогда он работает отлично. НО, мне все еще интересно, почему я не могу 'data.filter()'. Для вашей справки я использую Python 2.7x. –

+0

Я добавляю дополнительную информацию. Я распечатал «данные» в журнале сервера. Это похоже на [[Результаты: объект результатов>, <результаты: объект результатов>, <результаты: объект результатов> ...] '. поэтому я не могу адаптировать 'data.objects.filter()'. –

Смежные вопросы