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

问题描述 投票:1回答:3

当使用Django REST Framework中的HyperlinkedModelSerializer时,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字段。定义id = serializers.ReadOnlyField()对我也没有帮助,因为id应该是可编辑的。

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

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

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

有没有优雅的可能性添加字段id?也许压倒__init__方法?

python django django-rest-framework
3个回答
3
投票

id序列化程序中添加FooSerializer属性为:

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

0
投票

您可以创建自定义HyperlinkedModelSerializer并覆盖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)
         )

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


0
投票

HyperlinkedModelSerializer默认不包括id字段。您可以通过将id作为属性添加到序列化程序中来包含class FooSerializer(serializers.HyperlinkedModelSerializer): id = serializers.IntegerField() class Meta: model = Foo fields = '__all__'

qazxswpoi
© www.soinside.com 2019 - 2024. All rights reserved.