How can exculde the data in Django

Viewed 37

I am trying to exclude that orders which in my orderRequest table, but it show only that orders which is in orderRequest table and exclude the others.Function get the right id's of orders but it not exclude that orders. It exclude the other orders and show that orders which already in orderRequest table

View.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)

Model.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 %}
2 Answers

You can use the isnull lookup [Django docs] to find instances which don't have a related instance, so to find Order instances which have no OrderRequest instances you can use:

Order.objects.filter(orderRequest__isnull=True)

Hence you can write your view as:

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)

Note: Class names should be in PascalCase so OrderProductView instead of OrderProduct_View. Variable names should be in snake_case so filtered_orders instead of filteredOrders, etc. See PEP 8 -- Style Guide for Python Code

A:your function filter_order does not work, it always True;

B: return False in your try part

Related