2014-09-03 4 views
2

Я работаю над API-интерфейсом API Django REST и сталкиваюсь с некоторыми проблемами с использованием Serializers. Я попытаюсь немного устранить проблему. В основном есть модели Room и Location.Поле сериализованного поля вместо поля первичного ключа

class Room(models.Model): 
    uuid = UUIDField(primary_key=True) 
    ... 
    location = models.ForeignKey(Location, related_name='room') 
    ... 
class Location(models.Model): 
    uuid = UUIDField(primary_key=True) 
    name = models.CharField(max_length=255) 
    def __unicode__(self): 
     return unicode(self.name) 

и соответствующие сериализаторов,

class RoomSerializer(serializers.ModelSerializer): 
    location = serializers.RelatedField() 
    class Meta: 
     model = Room 
     fields = ('uuid', 'location') 
class LocationSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Location 
     fields = ('uuid', 'name') 

Я исследовал много способов, чтобы изменить отображение uuid с названием места, включая использование serializers.SerializerMethodField(), а также с использованием вышеуказанного serializers.RelatedField(), и они Выполнять работу. В качестве ссылки см. Выход JSON ниже.

{ 
    "uuid": "491ab09d-qqqq-wwww-eeee-5801dbac0fef", 
    "location": "Kota Kinabalu", 
    "created": "2014-09-03T07:52:45.399Z", 
    "modified": "2014-09-03T07:52:45.530Z" 
} 

Однако, я не в состоянии сделать model.save() в комнате, так как Django или, скорее, базу данных (PostgreSQL в моем случае) жалуется, что LOCATION_ID пуст. Я думаю, что это связано с тем, что когда я отправляю запрос POST в конечную точку API/api/rooms/location_id остается пустым, когда я изменяю свой RoomSerializer.

Если вы используете ModelViewSet по умолчанию, вы увидите, что в форме по умолчанию отсутствует форма местоположения.

Как правильно использовать сериализаторы, чтобы я мог отображать имя местоположения («Kota Kinabalu» вместо строки uuid, например, 6e6acbbb-xxxx-yyyy-zzzz-1cf1a5bac22c), и я все еще могу принять правильное Запрос POST?

ответ

0

Вы должны попробовать использовать настраиваемое поле UUID. Вы можете найти пример here.

+1

Возможно, ваше предложение, возможно, устранило мою проблему. Тем не менее, это заставило меня понять, что решение было в документах все время. В конечном итоге я использовал 'location = serializers.SlugRelatedField (slug_field = 'name')' –

2

(я двигаюсь quik_silv комментарий в ответ)

Вы должны использовать предоставленную SlugRelatedField ФПИ: http://www.django-rest-framework.org/api-guide/relations/#slugrelatedfield

В этом случае все, что вам нужно сделать, это добавить поле, как: location = serializers.SlugRela‌​tedField(slug_field='‌​name', read_only=True). Обратите внимание на использование параметра read_only, который должен устранить проблему при создании экземпляров модели.

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