代码之家  ›  专栏  ›  技术社区  ›  cezar Dennis Kioko

如何向DRF中的HyperlinkedModelSerializer中的字段添加“id”

  •  1
  • cezar Dennis Kioko  · 技术社区  · 6 年前

    当使用 HyperlinkedModelSerializer 从Django REST框架,字段 id 不包括在 fields 默认情况下。这个 question 有一个很好的解释。

    但是我有一个问题,我想用一种特殊的方式来解决。

    我有一个带有自定义ID的模型和几十个其他字段:

    class Foo(models.Model):
        id = models.IntegerField(primary_key=True)
        # 20-30 fields
    

    serializers.py 我想包括模型中的所有字段:

    class FooSerializer(serializers.HyperlinkedModelSerializer):
        class Meta:
            model = Foo
            fields = '__all__'
    

    但是,这不包括字段 身份证件 . 定义 id = serializers.ReadOnlyField() 也帮不了我,因为 身份证件 应该可以编辑。

    手动指定所有字段,如下所示:

    fields = ('id', # all other fields)
    

    这将是我试图规避的解决方案,因为模型类有很多字段,将来它们可能会改变。

    有没有优雅的可能性增加这个领域 身份证件 ?可能会凌驾于 __init__ 方法?

    3 回复  |  直到 6 年前
        1
  •  2
  •   cezar Dennis Kioko    6 年前

    添加 id 属性在 FooSerializer 序列化器:

    class FooSerializer(serializers.HyperlinkedModelSerializer):
        id = serializers.IntegerField()
        class Meta:
            model = Foo
            fields = '__all__'
        2
  •  0
  •   Enthusiast Martin    6 年前

    您可以创建自定义的超链接模型序列化程序并重写 get_default_field_names 像普通ModelSerializer那样包含ID。

    例子:

    class CustomHyperlinkedModelSerializer(HyperlinkedModelSerializer ):
    
        def get_default_field_names(self, declared_fields, model_info):
    
            return (
                [model_info.pk.name] +
                [self.url_field_name] +
                list(declared_fields) +
                list(model_info.fields) +
                list(model_info.forward_relations)
             )
    

    注:这只是一个想法。我还没有测试过。

        3
  •  0
  •   Rigo    6 年前

    HyperlinkedModelSerializer 不包括 id 默认为字段。你可以包括 身份证件 通过将其作为如下属性添加到序列化程序中:

    class FooSerializer(serializers.HyperlinkedModelSerializer):
        id = serializers.IntegerField()
        class Meta:
            model = Foo
            fields = '__all__'