Django: как «развернуть» поле, которое ссылается на перечисление, но не на другую таблицу

У меня есть главная таблица «PfPersona» с полем «stato_civile», которое принимает 1 char (ключ перечисления). Для этого примера предположим, что перечисление имеет только одно значение. В DB это значение будет «S». Верно ли определение перечисления?

class StatoCivile(Enum):
     S = "value"

А в моей основной модели я буду ссылаться на перечисление следующим образом:

stato_civile = models.CharField(StatoCivile,max_length=1, blank=True, null=True, db_column='stato_civile')

В сериализаторе основной модели у меня уже есть много расширяемых полей, и все они работают, потому что у них есть фактический FK. Я попытался поместить также «stato_civile», чтобы сделать его расширяемым.

expandable_fields = {
        "otherfield" : OtherFieldSerializer,
        .
        .
        "stato_civile":StatoCivileSerializer
    }

Я попытался определить StatoCivileSerializer

class StatoCivileSerializer(serializers.ModelSerializer):

class Meta:
    model = StatoCivile
    fields = ['name']#not sure what field I should define

Если я вызову URL с «stato_civile» в качестве расширяемого поля, как это

http://localhost:8000/pf/?expand=stato_civile

У меня эта ошибка

in __getattr__
raise AttributeError(name) from None
AttributeError: _meta

По сути, я не понял, как управлять Enums, потому что все остальные расширяемые поля у меня работают благодаря тому, что у них есть фактический ForeignKey.

Он сообщает, что вы неправильно указали имя поля.

Вот пример того, как я бы это сделал:

Вот как можно структурировать StatoCivileSerializer:

serializers.py

from rest_framework import serializers

class StatoCivileSerializer(serializers.ModelSerializer):
    stato_civile = serializers.ChoiceField(choices=StatoCivile)

    class Meta:
        model = StatoCivile
        fields = ['stato_civile']  # or "__all__"

Чтобы подключить сериализатор, можно сделать примерно следующее:

api.py

import rest_framework
from rest_framework import viewsets

class ModelNameViewSet(viewsets.ModelViewSet):
    http_method_names = ['get']
    serializer_class = StatoCivileSerializer
    queryset = ModelName.objects.all()
    lookup_field = ['stato_civile']
    renderer_classes = [rest_framework.renderers.JSONRenderer, rest_framework.renderers.BrowsableAPIRenderer] #The BrowsableAPIRenderer is used to display the API in a browser-friendly format. It is ideal for manual testing directly from the browser.

urls.py

from rest_framework import routers
from drf_yasg.views import get_schema_view

router = routers.DefaultRouter()
router.register(r'name_url', ModelNameViewSet, basename='name_url')

schema_view = get_schema_view(
   openapi.Info(
         title="RENTAL API",
         default_version='v1',
         description="Documentation",
      ),
      public=True,
      permission_classes=[permissions.AllowAny],
)

urlpatterns = [
    path('api/', include(router.urls)),
]

Теперь ваш API будет доступен с помощью фильтра по следующей ссылке: /api/name_url/?stato_civile=s

Вернуться на верх