如何使用多个查询参数获取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和producter_id从交易列表中获取(通过交易模型和序列化程序(。

这里你可以直接使用get_queryset方法,你肯定会从get_queryset方法的kwargs中得到参数,你可以从类中删除querysetookup_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.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)

最新更新