2013-11-20 2 views
6

Я хотел бы сериализацию модели с большим количеством вариантов, как например:сериализация текст выбора для IntegerField с выбором

class House(models.Model): 
ACCESSIBILITY_CHOICES = (
    (ACCESSIBILITY_FULL, 'Full'), 
    (ACCESSIBILITY_PARTIAL, 'Partial'), 
    (ACCESSIBILITY_NONE, 'None') 
) 

accessibility = models.IntegerField(max_length=1, choices=ACCESSIBILITY_CHOICES, null=True) 

Я люблю, что сериализатор по умолчанию, такие как:

class HouseView(generics.ListCreateAPIView): 
    model = House 
    serializer_class = HouseSerializer 

class HouseSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = House 

работы здорово, если я хочу просто целочисленное значение

{accessibility:1} 

Однако то, что я хотел бы получить

{accessibility:'Full'} 

Справка любезно оценена. Большое спасибо.

ответ

1

Установить выбор в области сериализатора с необработанным значениями, как так ...

ACCESSIBILITY_CHOICES = (
    ('Full', 'Full'), 
    ('Partial', 'Partial'), 
    ('None', 'None') 
) 

Тогда взгляните на переопределение «to_native» метода так, что строковые значения переводятся в их целых эквиваленты.

Это должно дать вам внешний API, который использует представления строк, но бэкэнд, который использует целочисленные представления.

+0

Хорошо, круто. Спасибо, что посмотрели на это. Хорошо, что я проверил, не было более декларативного решения для перезаписи to_native. –

6

Вы можете получить поле сериализатора только для чтения с подробным значением поля модели с выбором через метод get_FOO_display. Этот метод добавляется автоматически при настройке выбора в поле. Вы можете установить этот метод в качестве источника для символьного поля.

Для конечных точек, которые также поддерживают запись данных, я бы рекомендовал добавить «нормальное» поле и другое поле только для чтения с расширением _name.

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

class HouseSerializer(serializers.ModelSerializer): 

    accessibility_name = serializers.CharField(source='get_accessibility_display') 

    class Meta: 
     model = House 
     fields = ('accessibility', 'accessibility_name',) 
Смежные вопросы