Django REST: get_queryset с дублирующими ответами - PullRequest
1 голос
/ 06 марта 2019

Я создаю простое приложение для интернет-магазина, поэтому, когда вы хотите купить товар, нажатие кнопки приводит вас к списку API зарядки. (напр. пункт 2 будет направлен на / api / обвинение / 2)

urls.py

from django.urls import path
from gallery.views import ClothingView
from gallery.api.views import ListClothes
from gallery.api.views import ChargeView

urlpatterns = [
    path('api/<int:num>/', ListClothes.as_view()),
    path('api/charge/<int:num>', ChargeView.as_view(), name='charge_api'),
]

views.py

class ChargeView(ListCreateAPIView):
    serializer_class = ChargeSerializer
    count = 0

    def get_queryset(self):
        a = ClothingModel.objects.filter(id=self.kwargs['num']).first()
        net_price = int(float(a.full_price) * 100)
        if float(a.discount) > 0.00:
            net_price = int(net_price * (1 - (float(a.discount) / 100)))

        self.count += 1

        print(self.count)

        if self.count == 1:

            stripe.api_key = settings.API_KEY
            charge_rtn_body = stripe.Charge.create(    # Create charge object
                amount=net_price,
                currency="usd",
                source="tok_visa", # obtained with Stripe.js
                description= "[Stripe charge] " + a.description.upper()
            )

        return ClothingModel.objects.filter(id=self.kwargs['num'])

serializers.py

class ChargeSerializer(serializers.ModelSerializer):
    class Meta:
        model = ClothingModel
        fields = ('full_price', 'discount', 'description')

Я создаю объект начисления для Stripe (метод оплаты) каждый раз, когда вызывается API, но зависит от идентификатора предмета одежды. Поэтому, чтобы справиться с этим, я использую self.kwargs в get_queryset () для ссылки на элемент одежды. Когда я просматриваю платежи на панели инструментов Stripe после одного щелчка, происходит сразу несколько платежей (по 4 за раз). Я жестко закодировал if self.count == 1: как обходной путь, но знаю, что это не очень хорошая практика. Есть ли причина для этих многочисленных вызовов в get_queryset () для одного запроса и как я могу их реализовать чисто? Спасибо.

1 Ответ

0 голосов
/ 06 марта 2019

Объекты должны создаваться только в POST-запросах. get_queryset вызывается каждый раз, когда вызывается представление (даже для запросов GET). Таким образом, объект create должен быть перемещен внутри функции просмотра. Динамическая часть URL доступна из функции просмотра, представленной здесь - https://docs.djangoproject.com/en/2.1/topics/http/urls/#example

class ChargeView(ListCreateAPIView):

    def post(self, request, num):
        charge = ClothingModel.objects.get(id=num)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...