在我的模特中,我有"状态"和#34;国家"。一个国家可以有许多州。
使用PK 1的HTTP GET状态:
{
"id": 1,
"url": "http://test.com/states/1/",
"name": "Ohio",
"country": "http://test.com/countries/2/"
}
我喜欢在上面的表示中返回国家/地区的超链接相关字段。但是,它强制我在更新状态时POST超链接URL,这对客户来说可能很麻烦。我宁愿只发布国家的主键,如下所示:
HTTP PUT / POST:
{
"id": 1,
"url": "http://test.com/states/1/",
"name": "Ohio",
"country": 2
}
有优雅的方法吗?
供参考,以下是其他组成部分:
Models.py
class State(models.Model):
name = models.TextField()
country = models.ForeignKey(Country, related_name='states', null=True)
class Country(models.Model):
name = models.TextField()
Views.py
class StateViewSet(ExpandModelViewSet):
queryset = State.objects.all()
serializer_class = StateSerializer
class CountryViewSet(ExpandModelViewSet):
queryset = Country.objects.all()
serializer_class = CountrySerializer
Serializers.py
class StateSerializer(ExpandModelSerializer):
country = serializers.HyperlinkedRelatedField(view_name='country-detail', queryset=Country.objects.all(), allow_null=True)
class Meta:
model = State
fields = ('id', 'url', 'name', 'country')
class CountrySerializer(ExpandModelSerializer):
class Meta:
model = Country
fields = ['id', 'url', 'name']
答案 0 :(得分:0)
我相信序列化程序方法字段是您正在寻找的,然后您可以在序列化程序方法中获取并检查请求方法,并在此帮助下返回以您首选方式序列化的属性。
参考: http://www.django-rest-framework.org/api-guide/fields/#serializermethodfield
答案 1 :(得分:0)
你必须简单地将readonly设置为true read_only=True
,他不会强迫你插入整个链接,只需id即可:
class StateSerializer(ExpandModelSerializer):
country = serializers.HyperlinkedRelatedField(read_only=True, view_name='country-detail', queryset=Country.objects.all(), allow_null=True)
class Meta:
model = State
fields = ('id', 'url', 'name', 'country')
并在您的数据中发送country_id
密钥而不是country