我正在使用Django REST框架API,並且遇到了使用序列化程序的一些問題。我會盡量將問題隔離一點。基本上有Room
和Location
模型。將序列化程序字段顯示爲'named'字段而不是主鍵字段
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是空的。我認爲它的原因是,當我向API端點/ api/rooms發送POST請求時,修改RoomSerializer時,location_id留空。
如果使用默認的ModelViewSet,則會看到缺省表單中缺少Location字段。
如何正確使用序列化程序,以便我可以顯示位置的名稱(「Kota Kinabalu」而不是像6e6acbbb-xxxx-yyyy-zzzz-1cf1a5bac22c這樣的uuid字符串),並且我仍然能夠接受正確的POST請求?
你的建議可能可以解決我的問題。但是,它確實讓我意識到解決方案始終在文檔中。我最終使用了'location = serializers.SlugRelatedField(slug_field ='name')' – 2014-09-04 05:17:19