首页 > 解决方案 > 如何排除Django中的数据

问题描述

我试图排除我的 orderRequest 表中的订单,但它仅显示 orderRequest 表中的订单并排除其他订单。函数获取正确的订单 ID,但不排除该订单。它排除其他订单并显示已经在 orderRequest 表中的订单

视图.py

class OrderProduct_View(TemplateView):

     template_name = 'purchase/orderProduct.html'

     def get(self, request, *args, **kwargs):
         allOrder = OrderProduct.objects.all()
         allOrd = Order.objects.all()
         categories = Category.objects.all()
         categoryId = self.request.GET.get('SelectCategory')
         product = Product.objects.filter(category_id=categoryId)

     def filter_order(order):
         try:
            orderReq = order.orderRequest
            return orderReq
         except:
            return True

     filteredOrders = list(filter(filter_order, allOrd))
   
     args = {'categories': categories, 'product': product, 'filteredOrders': filteredOrders}

     return render(request, self.template_name, args)

模型.py

class OrderProduct(models.Model):
     product = models.ForeignKey(Product, on_delete=models.CASCADE)
     description = models.CharField(max_length=90)
     quantity = models.IntegerField()
     order_cancel = models.BooleanField(default=False)

class Order(models.Model):
     orderProduct = models.ForeignKey(OrderProduct, on_delete=models.CASCADE)
     created_by = models.CharField(max_length=20)
     created_at = models.DateTimeField(auto_now_add=True)
     destination = models.CharField(max_length=30)
     vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE)
     shipping_cost = models.IntegerField()


class OrderRequest(models.Model):
     order_status = models.CharField(max_length=10)
     order = models.OneToOneField(Order, related_name='orderRequest', on_delete=models.CASCADE)

HTML

  {% for allOrders in filteredOrders%}
       {{ allOrders.orderProduct.id }} 
       {{ allOrders.orderProduct.product.name }}
       {{ allOrders.orderProduct.quantity }}
       <button><a href="{% url 'allVendor' %}?product_id={{ allOrders.orderProduct.product.id }}&orderProducts_id={{ allOrders.orderProduct.id }}">Place Order</a></button>
  {% endfor %}

标签: pythondjangodjango-modelsdjango-viewsdjango-templates

解决方案


您可以使用isnull查找 [Django docs]来查找没有相关实例的实例,因此要查找Order没有OrderRequest实例的实例,您可以使用:

Order.objects.filter(orderRequest__isnull=True)

因此,您可以将视图写为:

class OrderProduct_View(TemplateView):
    template_name = 'purchase/orderProduct.html'
    
    def get(self, request, *args, **kwargs):
        filteredOrders = Order.objects.filter(orderRequest__isnull=True)
        categories = Category.objects.all()
        categoryId = self.request.GET.get('SelectCategory')
        product = Product.objects.filter(category_id=categoryId)
        args = {'categories': categories, 'product': product, 'filteredOrders': filteredOrders}
        return render(request, self.template_name, args)

注意:类名应该在PascalCasesoOrderProductView而不是OrderProduct_View. 变量名应该在 snake_casesofiltered_orders而不是filteredOrders等。请参阅PEP 8 -- Python 代码样式指南


推荐阅读