Как я могу повторно использовать представление Django с методом post для моего API

В настоящее время я пытаюсь создать API с DRF на моем бэкенде для мобильного приложения.

Я хотел бы узнать, можно ли повторно использовать некоторые уже реализованные методы POST, передавая им запрос в качестве параметра.

Спасибо,

Вот вид, о котором идет речь:

Меня интересует метод POST.

Я попробовал следующий код, я не знаю, хорошо ли это или есть лучший способ сделать это




class TestPost(views.APIView):

    permission_classes = (permissions.AllowAny,)

    def __init__(self):

        request = WSGIRequest({
            'REQUEST_METHOD': 'POST',
            'wsgi.input': StringIO(),
        })

        request.POST = QueryDict('csrfmiddlewaretoken=x9ceGh2r5yxBot8dqY4rBgKpOMCmqUzpSM937ZoBZ93TA0jRyHzfb5lDPpEfrUA0&name=cat0&order=3&category_image=image&form-TOTAL_FORMS=2&form-INITIAL_FORMS=0&form-MIN_NUM_FORMS=0&form-MAX_NUM_FORMS=1000&form-0-product=6/unit&form-0-quantity=123&form-1-product=5/unit&form-1-quantity=258', mutable=True)

        a= ShopModuleCategoryCreateView()
        
        a.has_permission()
        
        a.post(request=request)

Я бы предложил перенести вашу бизнес-логику в специальный метод в services.py и использовать новый метод в вашем представлении API и вашем существующем представлении django.

Следующий код - это просто черновик, чтобы показать намерение, он может быть не готов к копированию и вставке и не работать. Но идея должна быть ясна, что нужно делать.

services.py

def service_function(shop, module, category_name=None, category_order=None, category_image=None, cat_form_cleaned_data=None):
    if category_name and category_order and category_image:
        category = Category.objects.create(
            name=category_name,
            order=category_order,
            module=module,
            shop_id=shop.pk,
            category_image=category_image,
         )
        logger.error(shop.id)


    for product_form in (cat_form_cleaned_data or []):
        try:
            product = Product.objects.get(
                pk=product_form['product'].split('/')[0])
            if product.unit:
                quantity = int(product_form['quantity'])
            else:
                quantity = 1
            CategoryProduct.objects.create(
                category=category,
                product=product,
                quantity=quantity
            )
        except ObjectDoesNotExist:
            pass
        except KeyError:
            pass

views.py

class ShopModuleCategoryCreateView(ShopModuleMixin, BorgiaView):
    # your existing code ...

    def post(self, request, *args, **kwargs):
        """
        Permet de publier la creation d'une nouvelle categorie

        cat_name_form => renvoie une objet Form avec le nom et l'ordre entré
        self.module => Module de vente en libre service du magasin Pi
        """

        f = open("myfile.txt", "a")
        f.write(str(request))

        cat_name_form = ModuleCategoryCreateNameForm(request.POST)

        category_name = None
        category_order = None
        category_image = None
        if cat_name_form.is_valid():
            cat_form = self.form_class(request.POST)
            category_name=cat_name_form.cleaned_data['name']
            category_order=cat_name_form.cleaned_data['order']
            category_image=cat_name_form.cleaned_data['category_image']

        service_function(
            shop=self.shop,
            module=self.module,
            category_name=cat_name_form.cleaned_data['name'],
            category_order=cat_name_form.cleaned_data['order'],
            category_image=cat_name_form.cleaned_data['category_image'],
            cat_form_cleaned_data=cat_form.cleaned_data,
        )

        return redirect(self.get_success_url())

    # your code ...

api/views.py

class TestPost(views.APIView):
    permission_classes = (permissions.AllowAny,)

    def post(self, request):
        # add your code to determine the data from the API request
        service_function(shop, module, category_name, category_order, category_image, cat_form_cleaned_data, ...)
        # your API code
Вернуться на верх