При использовании 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__
?
3 ответа
Добавьте атрибут id
в сериализатор FooSerializer
как:
class FooSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.IntegerField(read_only=True)
class Meta:
model = Foo
fields = '__all__'
Вы можете создать свой собственный 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)
)
Примечание: это всего лишь идея. Я еще не проверял это.
HyperlinkedModelSerializer
по умолчанию не содержит поля id
. Вы можете включить id
, добавив его в сериализатор в качестве атрибута, подобного этому:
class FooSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.IntegerField()
class Meta:
model = Foo
fields = '__all__'
Похожие вопросы
Новые вопросы
python
Python - это мультипарадигмальный динамически типизированный многоцелевой язык программирования, разработанный для быстрого (для изучения, использования и понимания) и для обеспечения чистого и унифицированного синтаксиса. Обычно используются две похожие, но несовместимые версии Python, Python 2.7 и 3.x. Для специфичных для версии вопросов Python добавьте тег [python-2.7] или [python-3.x]. При использовании варианта или библиотеки Python (например, Jython, PyPy, Pandas, Numpy), пожалуйста, включите их в теги.