我正在使用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