2014-09-03 63 views
2

我正在使用Django REST框架API,並且遇到了使用序列化程序的一些問題。我會盡量將問題隔離一點。基本上有RoomLocation模型。將序列化程序字段顯示爲'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請求?

回答

0

您應該嘗試使用自定義的UUID相關字段。你可以找到一個例子here

+1

你的建議可能可以解決我的問題。但是,它確實讓我意識到解決方案始終在文檔中。我最終使用了'location = serializers.SlugRelatedField(slug_field ='name')' – 2014-09-04 05:17:19

2

(我移動到一個答案quik_silv評論)

您應該使用DRF提供的SlugRelatedField:http://www.django-rest-framework.org/api-guide/relations/#slugrelatedfield

在這種情況下,所有你需要做的就是添加一個字段,如:location = serializers.SlugRela‌​tedField(slug_field='‌​name', read_only=True)。請注意使用參數read_only,它應該解決創建模型實例時的問題。