2014-09-03 61 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,它应该解决创建模型实例时的问题。