如何在集合中使用 Get 和 Filter 来获取与特定用户相关的值
How to use Get and Filter in set to get values related to a particular user
我正在尝试获取特定用户下的订单的价值,我的意思是我有一个电子商务应用程序,用户可以在其中进行购买,我成功地获得了在用户想要下订单时显示的订单项,但我想让该用户已经购买的所有订单显示在不同的页面(订单历史记录)中,我正在尝试对序列化程序使用查询集,但尽管进行了多次调整,但它还是不起作用,我已经准备好文档但似乎做对了。请帮忙,
型号:
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
ref_code = models.CharField(max_length=20, blank=True, null=True)
items = models.ManyToManyField(eOrderItem)
start_date = models.DateTimeField(auto_now_add=True)
ordered_date = models.DateTimeField(null=True)
ordered = models.BooleanField(default=False)
payment = models.ForeignKey(
'Payment', on_delete=models.SET_NULL, blank=True, null=True)
coupon = models.ForeignKey(
'Coupon', on_delete=models.SET_NULL, blank=True, null=True)
being_delivered = models.BooleanField(default=False)
received = models.BooleanField(default=False)
refund_requested = models.BooleanField(default=False)
refund_granted = models.BooleanField(default=False)
transaction_id = models.CharField(max_length=200, null=True)
qr_code = models.ImageField(upload_to='qrcode', blank=True)
这是(订单历史)的序列化器
class TicketSerializer(serializers.ModelSerializer):
order_items = serializers.SerializerMethodField()
class Meta:
model = Order
fields = '__all__'
def get_order_items(self, obj):
return OrderItemSerializer().data
查看:
class TicketDetailView(RetrieveAPIView):
serializer_class = TicketSerializer
permission_classes = (IsAuthenticated,)
def get_object(self):
try:
# order = Order.objects.get(user=self.request.user).filter(ordered=True)
# order = Order.objects.filter(order=True)
# order = Order.objects.get(user=self.request.user, ordered=True)
order = Order.objects.filter(ordered=False, user=self.request.user)
return order
except ObjectDoesNotExist:
return Response({"message": "You do not have any ticket"}, status=HTTP_400_BAD_REQUEST)
从视图中,您可以看到我尝试使用查询集尝试了可能的选项,但它不起作用,当我使用 get(user=self.request.user) 时它有效,但是当我通过 Order=True
(对于订单历史记录)它说 get() returned more than one Order -- it returned 3!
并且我理解因为我使用 get() (其他选项不起作用)当我通过 Order=False
(因为它适用于要购买的订单项目)它有效因为一次只有一个。
请问我该怎么办,我只想获取特定用户订购的所有商品。
您期望得到多个结果,这就是为什么您应该覆盖 get_queryset()
而不是 get_object()
(应该用于详细视图):
def get_queryset(self):
return Order.objects.filter(ordered=False, user=self.request.user)
我正在尝试获取特定用户下的订单的价值,我的意思是我有一个电子商务应用程序,用户可以在其中进行购买,我成功地获得了在用户想要下订单时显示的订单项,但我想让该用户已经购买的所有订单显示在不同的页面(订单历史记录)中,我正在尝试对序列化程序使用查询集,但尽管进行了多次调整,但它还是不起作用,我已经准备好文档但似乎做对了。请帮忙,
型号:
user = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete=models.CASCADE)
ref_code = models.CharField(max_length=20, blank=True, null=True)
items = models.ManyToManyField(eOrderItem)
start_date = models.DateTimeField(auto_now_add=True)
ordered_date = models.DateTimeField(null=True)
ordered = models.BooleanField(default=False)
payment = models.ForeignKey(
'Payment', on_delete=models.SET_NULL, blank=True, null=True)
coupon = models.ForeignKey(
'Coupon', on_delete=models.SET_NULL, blank=True, null=True)
being_delivered = models.BooleanField(default=False)
received = models.BooleanField(default=False)
refund_requested = models.BooleanField(default=False)
refund_granted = models.BooleanField(default=False)
transaction_id = models.CharField(max_length=200, null=True)
qr_code = models.ImageField(upload_to='qrcode', blank=True)
这是(订单历史)的序列化器
class TicketSerializer(serializers.ModelSerializer):
order_items = serializers.SerializerMethodField()
class Meta:
model = Order
fields = '__all__'
def get_order_items(self, obj):
return OrderItemSerializer().data
查看:
class TicketDetailView(RetrieveAPIView):
serializer_class = TicketSerializer
permission_classes = (IsAuthenticated,)
def get_object(self):
try:
# order = Order.objects.get(user=self.request.user).filter(ordered=True)
# order = Order.objects.filter(order=True)
# order = Order.objects.get(user=self.request.user, ordered=True)
order = Order.objects.filter(ordered=False, user=self.request.user)
return order
except ObjectDoesNotExist:
return Response({"message": "You do not have any ticket"}, status=HTTP_400_BAD_REQUEST)
从视图中,您可以看到我尝试使用查询集尝试了可能的选项,但它不起作用,当我使用 get(user=self.request.user) 时它有效,但是当我通过 Order=True
(对于订单历史记录)它说 get() returned more than one Order -- it returned 3!
并且我理解因为我使用 get() (其他选项不起作用)当我通过 Order=False
(因为它适用于要购买的订单项目)它有效因为一次只有一个。
请问我该怎么办,我只想获取特定用户订购的所有商品。
您期望得到多个结果,这就是为什么您应该覆盖 get_queryset()
而不是 get_object()
(应该用于详细视图):
def get_queryset(self):
return Order.objects.filter(ordered=False, user=self.request.user)