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']
Вернуться на верх