Как получить с несколькими параметрами запроса представление Genereic API

Итак, я создаю API и хочу получать данные на основе нескольких параметров.

Вот кодовая база.

Путь Url:

path('<str:order_id>/consumers/', SingleConsumerTradeAPIView.as_view(), name="single-consumer-trade" ),
path('<str:order_id>/producers/', SingleProducerTradeAPIView.as_view(), name="single-producer-trade" ),

Models.py:

from django.db import models
from authApi.models import User

class Order(models.Model):
    user = models.ForeignKey(User,related_name='user',null=True, on_delete=models.CASCADE)
    date = models.DateField(auto_now_add=True)

class Trade(models.Model):
    consumer = models.ForeignKey(User,related_name='consumer',on_delete=models.CASCADE)
    producer = models.ForeignKey(User,related_name='producer',on_delete=models.CASCADE)
    order = models.ForeignKey(Order, related_name='trades',on_delete=models.CASCADE)
    price = models.DecimalField(max_digits=10, max_length=255, decimal_places=2)
    location = models.CharField(max_length=255)
    energyQuantity = models.DecimalField(max_digits=10, max_length=255, decimal_places=2)
    startTime = models.DateField(auto_now_add=True)
    stopTime = models.DateField(auto_now_add=True)

Serializers.py:

class TradeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Trade
        fields = ('id',
                  'order_id',
                  'startTime',
                  'stopTime',
                  'price',
                  'consumer_id',
                  'producer_id',
                  'location',
                  'energyQuantity',
                )


class OrderSerializer(serializers.ModelSerializer):
    trades = TradeSerializer(read_only=True, many= True)
    class Meta:
        model = Order
        fields = ('id',
                  'trades',
                  'date',
                )

Что я пробовал:

Виды

class SingleProducerTradeAPIView(ListCreateAPIView):
    serializer_class=TradeSerializer
    queryset = Trade.objects.all()
    permission_classes = (permissions.IsAuthenticated,)
    lookup_fields = ('order_id', 'producer_id')

    def list(self, *args, **kwargs):
        order_id = kwargs.get('order_id')
        user = self.request.user
        try:
            trades = Trade.objects.filter(order_id=order_id,consumer_id=user)
        except Trade.DoesNotExist: 
            return JsonResponse({'message': 'The user does not exist'}, status=status.HTTP_404_NOT_FOUND) 
        order_serializer = TradeSerializer(trades, many=True) 
        return JsonResponse(order_serializer.data, safe=False) 
    
    def perform_create(self, serializer):
        return serializer.save(consumer_id=self.request.user)

Я хочу иметь возможность получать данные из списка сделок (через торговую модель и сериализаторы), используя order_id и producer_id.

Django будет передавать параметры из URL в функции представления как аргументы ключевых слов (**kwargs)

class SingleConsumerTradeAPIView(ListCreateAPIView):
    serializer_class=TradeSerializer
    queryset = Trade.objects.all()
    permission_classes = (permissions.IsAuthenticated,)
    lookup_fields = ('order_id', 'producer_id')

    def list(self, *args, **kwargs):
        order_id = kwargs.get('order_id')
        user_id = kwargs.get('user_id')

        # do some work with order_id and user_id
    
    def get_queryset(self):
        return self.queryset.filter(order_id=self.request.user,producer_id=
self.request.user)

Здесь вы можете напрямую использовать метод get_queryset и вы обязательно получите параметры из kwargs метода get_queryset и вы можете удалить переменную queryset из класса и напрямую выполнить запрос в методе get_queryset. Это позволит сэкономить время, обратившись к базе данных только один раз. В переменной lookup_fields тоже нет необходимости, поэтому ее можно удалить.

class SingleConsumerTradeAPIView(ListCreateAPIView):
    serializer_class=TradeSerializer
    permission_classes = (permissions.IsAuthenticated,)
    lookup_fields = ('order_id', 'producer_id')

    
    def get_queryset(self, *args, **kwargs):
        return Trade.objects.filter(order_id=kwargs.get('order_id'),producer_id=
self.request.user)
Вернуться на верх