Django RestFramework заставляет lookup_field принимать специальные символы (".")

Я работаю над набором представлений DRF, который имеет пользовательский запрос (с использованием annotate для группировки данных), для этого я хочу реализовать функции list, retrive и delete на основе поля под названием "batch", которое содержит строку со специальными символами, такими как "-" и ".". Мне удается заставить viewset перечислять и удалять данные, но при наличии специальных символов (".") в строке batch возврат данных не происходит. Как настроить маршрутизатор viewset так, чтобы разрешить "." в имени партии?

class BatchViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.values('batch', 'customer', 'order_number').annotate(
        total_quantity=Sum('total_quantity'),
        ready_quantity=Sum('ready_quantity')
    ).filter(deleted_at__isnull=True).all()
    serializer_class = BatchSerializer

    lookup_field = 'batch'

    filter_backends = [filters.SearchFilter, filters.OrderingFilter]
    search_fields = ['batch', 'customer', 'order_number']

    ordering_fields = ['batch', 'customer', 'order_number',
                       'total_quantity', 'ready_quantity']
    ordering = ['batch']

    def create(self, request, *args, **kwargs):
        raise MethodNotAllowed('POST')

router.register(r'batches', BatchViewSet, basename="batches")

Вот маршруты, созданные для получения сведений о партии

products/ ^batches/(?P<batch>[^/.]+)/$ [name='batches-detail']
products/ ^batches/(?P<batch>[^/.]+)\.(?P<format>[a-z0-9]+)/?$ [name='batches-detail']

, который не работает на моей партии TEATECH.01427964.11.08, но работает на TEATECH.

Я попробовал сделать пользовательский маршрутизатор для получения номера партии, но он также не работает, и я не могу создать regex, который может обрабатывать партию. Аналогично я не могу настроить lookup_field_regex для получения строки партии.

Я могу перемещаться по пакетному ретривалу, используя имя партии внутри поиска products/batches?search=TEATECH.01427964.11.08 вот так, но это хакерское решение и не будет работать с функцией delete batch, так что как я должен с этим справиться?

Добавлена функция re_path в пути наборов представлений для получения таких символов, как TEATECH.01427964.11.08.

urls.py

from rest_framework.routers import DefaultRouter
from django.urls import re_path
from . import views


router = DefaultRouter()
batch_detail = views.BeeViewSet.as_view(
    {"get": "retrieve", "patch": "partial_update", "delete": "destroy"})
router.register(r"batches", BatchViewSet, basename="batches")

urlpatterns = [
  re_path(r"^products/batches/(?P<batch>[^/*]+)/$", batch_detail),
]

urlpatterns += router.urls

При добавлении вышеуказанного маршрута нижеприведенный запрос работает.

GET --> products/batches/TEATECH.01427964.11.08/

Автор вопроса попросил сформировать строку запроса (products/batches?search=TEATECH.01427964.11.08), но '?' не работает так, как задумано в django's re_path.

Возможно, это связано с тем, что он перекрывает строку запроса, но это не точно. (Если кто-то знает об этом, пожалуйста, прокомментируйте)

Неудобно удалять только '?'(products/batches/search=TEATECH.01427964.11.08), поэтому я сделал его в базовом наборе, предоставляемом viewsets.

Это недостаточный ответ, но я подумал, что он может помочь как альтернатива, поэтому я ответил.

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