Я хочу сериализовать модель, но хочу включить дополнительное поле, которое требует выполнения некоторых операций поиска в базе данных для экземпляра модели, который необходимо сериализовать:
class FooSerializer(serializers.ModelSerializer):
my_field = ... # result of some database queries on the input Foo object
class Meta:
model = Foo
fields = ('id', 'name', 'myfield')
Как правильно это сделать? Я вижу, что вы можете передать в дополнительный «контекст» сериализатору, является ли правильным ответом передать дополнительное поле в контекстном словаре? При таком подходе логика получения нужного мне поля не будет автономной с определением сериализатора, что является идеальным, так как потребуется каждому сериализованному экземпляру my_field
. В другом месте в документации по сериализаторам DRF говорится, что «дополнительные поля могут соответствовать любому свойству или вызываться в модели». О дополнительных полях я говорю? Должен ли я определить функцию в Foo
определении модели, которая возвращает my_field
значение, и в сериализаторе я подключаю my_field к этому вызываемому объекту? На что это похоже?
Заранее спасибо, с удовольствием уточню вопрос при необходимости.
field_name = serializers.SerializerMethodField()
иdef get_field_name(self, obj):
foo
когда определяется SerializerMethodField? Когда используется CreateAPIView, хранится ли foo, можно ли использовать метод is_named_bar ()?Вы можете изменить метод модели на свойство и использовать его в сериализаторе с этим подходом.
Изменить: В последних версиях остальные рамки (я попробовал 3.3.3), вам не нужно менять свойство. Модельный метод будет просто отлично работать.
источник
variable = model_instance.my_field
дает тот же результат, что иvariable = model_instance.my_field()
без декоратора. также: stackoverflow.com/a/6618176/2198571source='my_field'
больше не требуется и выдвигает исключениеВ последней версии Django Rest Framework вам необходимо создать метод в вашей модели с именем поля, которое вы хотите добавить. Нет необходимости
@property
иsource='field'
поднять ошибку.источник
request
внутри def foo (self) был объект, который мог бы изменить значение foo? (пример поиска на основе request.user)Мой ответ на подобный вопрос ( здесь ) может быть полезным.
Если у вас есть метод модели, определенный следующим образом:
Вы можете добавить результат вызова указанного метода в ваш сериализатор следующим образом:
ps Так как пользовательское поле на самом деле не является полем в вашей модели, вы обычно захотите сделать его доступным только для чтения, например, так:
источник
если вы хотите читать и писать в вашем дополнительном поле, вы можете использовать новый настраиваемый сериализатор, который расширяет serializers.Serializer, и использовать его следующим образом
я использую это в связанных вложенных полях с некоторой пользовательской логикой
источник
Это сработало для меня . Если мы хотим просто добавить дополнительное поле
ModelSerializer
, мы можем сделать это, как показано ниже, а также поле может быть присвоено некоторое значение val после некоторых вычислений поиска. Или в некоторых случаях, если мы хотим отправить параметры в ответ API.В model.py
В serializer.py
Надеюсь, это может кому-то помочь.
источник
Как сказал Chemical Programer в этом комментарии , в последнем DRF вы можете просто сделать это так:
DRF документация источник
источник