При использовании HyperlinkedModelSerializer из Django REST Framework поле id по умолчанию не включается в fields. На этот вопрос есть ответ, который хорошо это объясняет.

Однако у меня есть проблема, которую я бы хотел решить определенным образом.

У меня есть модель с пользовательским идентификатором и несколько десятков других полей:

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__?

1
cezar 21 Авг 2018 в 13:43

3 ответа

Лучший ответ

Добавьте атрибут id в сериализатор FooSerializer как:

class FooSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.IntegerField(read_only=True)
    class Meta:
        model = Foo
        fields = '__all__'
4
JPG 28 Авг 2019 в 01:21

Вы можете создать свой собственный HyperlinkedModelSerializer и переопределить get_default_field_names, чтобы включить идентификатор, как это делает обычный ModelSerializer.

Примере:

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
Enthusiast Martin 21 Авг 2018 в 10:55

HyperlinkedModelSerializer по умолчанию не содержит поля id. Вы можете включить id, добавив его в сериализатор в качестве атрибута, подобного этому:

class FooSerializer(serializers.HyperlinkedModelSerializer):
    id = serializers.IntegerField()
    class Meta:
        model = Foo
        fields = '__all__'
0
Rigo 21 Авг 2018 в 11:03
51946916