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