DRF: Как создать несколько "детальных" представлений для модели?
У меня есть модель django, которая имеет множество полей, которые необходимо использовать в качестве ключа, а также несколько детальных представлений.
Например, мои конечные точки в настоящее время выглядят следующим образом, используя detail=True для получения второго набора:
my.api/things/{id_1} (GET, POST, DELETE)
my.api/things/{id_1}/whatever (GET, POST)
Все это замечательно, но мне нужно добраться до чего-то, что выглядит следующим образом:
my.api/things/{id_1} (GET, POST, DELETE)
my.api/things/{id_1}/whatever (GET, POST)
my.api/things/other_id/{id_2} (GET, POST, DELETE)
my.api/things/other_id/{id_2}/whatever (GET, POST)
Если это поможет, набор конечных точек детализации (т.е. whatever) идентичен, и нет никакой разницы в функциональности между ними. Мне просто нужно иметь возможность доступа к базе данных через любое поле.
Я новичок в django, поэтому извините, если это простой вопрос. Любая помощь будет оценена по достоинству!
Вы можете просто наследовать базовый класс и создавать все, что захотите.
Например,
class MultipleFieldLookupMixin:
"""
Apply this mixin to any view or viewset to get multiple field filtering
based on a `lookup_fields` attribute, instead of the default single field filtering.
"""
def get_object(self):
queryset = self.get_queryset() # Get the base queryset
queryset = self.filter_queryset(queryset) # Apply any filter backends
filter = {}
for field in self.lookup_fields:
if self.kwargs[field]: # Ignore empty fields.
filter[field] = self.kwargs[field]
obj = get_object_or_404(queryset, **filter) # Lookup the object
self.check_object_permissions(self.request, obj)
return obj
Затем вы можете просто применить этот миксин к представлению или набору представлений в любое время, когда вам нужно применить пользовательское поведение.
class RetrieveUserView(MultipleFieldLookupMixin, generics.RetrieveAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
lookup_fields = ['account', 'username']