【问题标题】:Serialize ID and URL at the same time Django Rest Framework同时序列化 ID 和 URL Django Rest Framework
【发布时间】:2020-10-13 08:03:20
【问题描述】:

我从 DRF 开始,我想同时序列化 IDHyperlinked URL

让我定义一个简单的示例模型:

class Account(model.Models):
    name = models.CharField(max_length=100)
    active = models.BooleanField()

我知道有一个ModelSerializer代表对象如下:

{
   "id": 1,
   "name": "library",
   "active": true
}

还有一个HyperlinkedModelSerializer,它代表如下对象:

{
   "url": "http://127.0.0.1:8000/core/accounts/1/",
   "name": "library",
   "active": true
}

本质上在HyperlinkedModelSerializer 中我们可以检索行的ID,但是我正在寻找的是得到这样的东西:

{
   "id": 1,
   "url": "http://127.0.0.1:8000/core/accounts/1/",
   "name": "library",
   "active": true
}

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    我检查了docs,您可以通过将其包含在fields 中来显式添加字段“id”。

    class AccountSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = Account
            fields = ['url', 'id', 'name', 'active']
    

    【讨论】:

    • 太棒了!意思是fields = '__all__'没有序列化所有相关字段?我这样说是因为我不想重复自己并保持简单,我的意思是......我要避免的是定义我的模型字段,然后在序列化程序中再次定义它们。
    • 我可以做一些像fields = ['id'] + ['__all__']这样的前缀吗?
    • 通常 id 会自动包含在 __all__ 中,但 HyperLinkedModelSerializer 会将 'id' 替换为 'url'。
    • 可悲的是,DRF serializers don't support __all__ and additional fields. 它是一个列表、元组或字符串 'all',但不是组合。所以这里最好的选择是手动指定你的字段。 (或使用自定义扩展 HyperLinkedModelSerializer 子类)
    【解决方案2】:

    我从here 得到了答案,它对我很有效。

    这样做可以避免定义模型的字段,然后在序列化程序中再次定义它们,使用 idurl 字段,如 ['url', 'id', 'name', 'active']

    这个例子看起来很假,但是当你处理具有更多字段的模型时,这可以为你节省很多时间......

    class AccountSerializer(serializers.HyperlinkedModelSerializer):
    
        class Meta:
            model = Account
            fields = [field.name for field in model._meta.fields]
            fields.extend(['id', 'url'])
    

    【讨论】:

      猜你喜欢
      • 2014-04-13
      • 2014-08-08
      • 2016-09-29
      • 2017-07-28
      • 2015-06-29
      • 2015-01-12
      • 2016-07-21
      • 2015-12-13
      • 2014-01-31
      相关资源
      最近更新 更多