Django REST框架:动态序列化器关系字段 - POST pk但GET超链接

时间:2015-12-14 23:20:23

标签: django django-rest-framework

在我的模特中,我有"状态"和#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']

2 个答案:

答案 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