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.
Это недостаточный ответ, но я подумал, что он может помочь как альтернатива, поэтому я ответил.