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

2023-12-21

在我的模型中,我有“州”和“国家”。一个国家可以有多个州。

PK 1 的 HTTP GET 状态:

{
    "id": 1,
    "url": "http://test.com/states/1/",
    "name": "Ohio",
    "country": "http://test.com/countries/2/"
}

我喜欢在上面的表示中返回国家/地区的超链接相关字段。然而,它迫使我在更新状态时发布超链接 URL,这对客户来说可能很麻烦。我宁愿只发布国家/地区的主键,如下所示:

HTTP 放置/发布:

{
    "id": 1,
    "url": "http://test.com/states/1/",
    "name": "Ohio",
    "country": 2
}

有没有一种优雅的方法来做到这一点?

作为参考,以下是其他组件:

模型.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

序列化器.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']

你必须简单地将 readonly 设置为 trueread_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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐