2017-02-20 20 views
0

Как изменить представление Serializer для запроса GET и POST? В настоящее время я использую StringRelatedField в HotelSerializer, который позволяет только читать только Feld. Я не могу POST каких-либо данных, потому что StringRelatedField не сопоставляет идентификатор в моем случае. Однако id является manadotory. Для запроса POST.Как представить разные значения для методов GET и POST в одном поле сериализатора?

Если я использую PrimaryKeyRelatedField для размещения в HotelSerializer чем запрос POST будет выполнен и объект будет сохранен успешно

Но попав в апи для запроса GET Для отеля с идентификатором 1 ответ будет

{ "id": 1, "name": "asasa", "discription": "sasas", "location": 1, } 

, но я хотел ответ должен включать название города не идентификатор Расположение Когда я сделать ПОЛУЧИТЬ Request

{ "id": 1, "name": "asasa", "discription": "sasas", "location": "delhi", } 

или

{ "id": 1, "name": "asasa", "discription": "sasas","location": "Mumbai", } 

модели

class Location(models.Model): 
    country = models.CharField(max_length=60) 
    city = models.CharField(max_length=60,db_index=True) 
    zipcode = models.CharField(max_length=10 
class Hotel(models.Model): 
    name =models.CharField(max_length=200,db_index=True) 
    discription = models.TextField(blank=True,null=True) 
    location = models.ForeignKey(Location,related_name='hotels') 

Serializer

class HotelSerializer(serializers.ModelSerializer): 
    location=serializers.StringRelatedField() #this line Cause Problem 

    class Meta: 
     model = Hotel 
     fields= ('id','name','discription','location',) 
+0

Я предлагаю вам сделать 2 сериализаторы, один для вставки или создать и другие для ГЭТ. – marin

ответ

2

В вашем случае вам не нужно никакого специального поля, ФПИ обеспечит PrimaryKeyRelateField по умолчанию для вас:

class HotelSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Hotel 
     fields= ('id','name','discription','location',) 

Кроме того, все поля в Django с использованием по умолчанию не нулевое Ограничить, например null=False. Если вы хотите сохранить нулевое значение вы должны явно записать его в поле:

class Hotel(models.Model): 
    location = models.ForeignKey(Location,related_name='hotels', null=True, blank=True) 

null=True позволяет сохранить нулевое значение и blank=True сделать это поле не требуется в проверке формы.
UPDATE:
Если вы хотите изменить представление сериализатора полей можно переопределить to_representation метод:

class HotelSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Hotel 
     fields= ('id','name','discription','location') 

    def to_representation(self, instance): 
     representation = super(HotelSerializer, self).to_representation(instance) 
     representation['location'] = instance.location.city 
     return representation 
+0

null = True приведет к экономии горячих точек без ссылки на объект местоположения, но я хотел, чтобы отель должен был ссылаться на местоположение (обязательно) –

+0

@SyedMoinuddinShibli, так что проблема? не используйте 'null' и' blank' и всегда передайте 'id' местоположения в поле' HotelSerializer' ' –

+0

. Я передаю идентификатор Location в поле формы, но все же я получаю ту же ошибку Исключение Тип: IntegrityError at/api/hotels/ Исключение: NOT NULL ограничение не удалось: hotels_hotel.location_id Запросить информацию –

1

модели
location = models.ForeignKey(Location, null=True, blank=True) 

Serializer
class HotelSerializer(serializers.ModelSerializer): 
    location=serializers.PrimaryKeyRelatedField(queryset=Location.objects.all(), required=False) #this line Cause Problem 

    class Meta: 
     model = Hotel 
     fields= ('id','name','discription','location',) 
+0

Могу ли вы объяснить мне роль required = False .. –

+0

Причина, по которой я не использую PrimaryKeyRelatedField(), потому что он будет показывать только идентификатор location в json, где, если требуется, String-представление объектов местоположения на основе города поле ... Она возвращает объект JSON в качестве { "ID": 1, "имени": "asasa", "Описаня": "ВРАТА" "местоположение": 3, } , но я хочу { "идентификатор": 1, "имя": "asasa", "Описане": "ВРАТА" "место": Дели, } –

+0

Пожалуйста, обновите свой вопрос с полной спецификацией. – marin