Как получить экземпляр синглтонной модели с помощью DRF без необходимости указывать id?
У меня есть приложение django, и я использую django-solo для SingletonModel. У меня есть синглтонная модель настроек:
class GeneralSettings(SingletonModel):
allow_signup = models.BooleanField(default=True)
Я хочу создать конечную точку API, чтобы иметь возможность получать и обновлять настройки. В настоящее время я использую DRF. Используя RetrieveModelMixin
и UpdateModelMixin
, я могу легко сделать это, но тогда мой маршрут должен быть таким:
.../api/settings/1
< Мне нужно добавить id.
Как я могу получить / обновить настройки, не используя id (так как это не имеет смысла для SingletonModel)?
DRF-вид:
class GeneralSettingsViewSet(
RetrieveModelMixin,
UpdateModelMixin,
GenericViewSet,
):
queryset = GeneralSettings.objects.all()
serializer_class = GeneralSettingsSerializer
http_method_names = ["get", "put"]
def get_object(self) -> GeneralSettings:
return GeneralSettings.get_solo()
Роутер:
router.register(r"settings", GeneralSettingsViewSet, "api-settings")
Вы можете использовать пользовательский маршрутизатор для решения вашей проблемы. Ниже приведен пример того, как это может выглядеть:
from rest_framework.routers import Route, SimpleRouter
class SingletonRouter(SimpleRouter):
routes = [
Route(
url=r'^{prefix}{trailing_slash}$',
mapping={
'get': 'retrieve',
'put': 'update',
},
name='{basename}-detail',
detail=True,
initkwargs={'suffix': 'Instance'}
),
]
router = SingletonRouter()
router.register(r'settings', GeneralSettingsViewSet, 'api-settings')
Теперь это должно сработать:
GET .../settings/
PUT .../settings/