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