Как получить с несколькими параметрами запроса представление 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)