Рекомендации по использованию @property со значениями Enum в модели Django для сериализации DRFPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Рекомендации по использованию @property со значениями Enum в модели Django для сериализации DRF

Сообщение Anonymous »

Вопрос: Мне нужно руководство по использованию @property в модели Django, особенно когда свойство возвращает значение Enum и его необходимо представить в сериализаторе Django REST Framework (DRF). Вот моя настройка:
Я определил Enum, AccountingType, чтобы представить возможные типы учета:

Код: Выделить всё

from enum import Enum

class AccountingType(Enum):
ASSET = "Asset"
LIABILITY = "Liability"
UNKNOWN = "Unknown"
В моей модели учетной записи я использую метод @property для определения типа учета на основе существующих полей:

Код: Выделить всё

# Account fields ...

@property
def accounting_type(self) -> AccountingType:
"""Return the accounting type for this account based on the account sub type."""
if self.account_sub_type in constants.LIABILITY_SUB_TYPES:
return AccountingType.LIABILITY

if self.account_sub_type in constants.ASSET_SUB_TYPES:
return AccountingType.ASSET

return AccountingType.UNKNOWN
В представлениях Django я могу без проблем использовать это свойство напрямую. Например:

Код: Выделить всё

account = Account.objects.get(id=some_id)
if account.accounting_type == AccountingType.LIABILITY:
print("This account is a liability.")
Проблема: При попытке предоставитьaccounting_type в DRF использование сериализаторов.ReadOnlyField() не включает свойство в сериализованный вывод:

Код: Выделить всё

class AccountDetailSerializer(serializers.ModelSerializer):
accounting_type = serializers.ReadOnlyField()

class Meta:
model = Account
fields = ['accounting_type', 'account_id', ...]
Я обнаружил, что переключение на сериализаторы.SerializerMethodField() решает проблему, позволяя мне вернуть значение Enum в виде строки:

Код: Выделить всё

class AccountDetailSerializer(serializers.ModelSerializer):
accounting_type = serializers.SerializerMethodField()

class Meta:
model = Account
fields = ['accounting_type', 'account_id', ...]

def get_accounting_type(self, obj):
return obj.accounting_type.value  # Return the Enum value as a string
Вопросы:
  • Есть ли причина, по которой сериализаторы.ReadOnlyField() не работают работать с @property, когда он возвращает Enum? Обрабатывает ли DRF поля @property по-разному в зависимости от типа возвращаемого значения?
  • Является ли SerializerMethodField рекомендуемым подходом, когда свойство возвращает сложный тип, например Enum, требующий специальной сериализации?
    Существуют ли передовые методы представления значений Enum через свойства модели в DRF?
Будем признательны за любую информацию.

Подробнее здесь: https://stackoverflow.com/questions/791 ... for-drf-se
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»