通过模板中的关系进行多对多反转

Many to many reversing through relationship in the template

我想访问反向关系的数据,我想为一天中的所有销售做一个清单,但我不知道反向关系的正确方法。

  1. 模板上有方法吗?
  2. 最好在 View 上做还是做一些自定义过滤器???

模特们

class Product(models.Model):
    name = models.CharField(null=True, max_length=30, )
    price = models.IntegerField(default=0)
    description = models.CharField(null=True, max_length=100, )

class Order(models.Model):
    date = models.DateTimeField(auto_now_add=True, null=True)
    table = models.IntegerField(null=False, max_length=2, )
    waiter = models.ForeignKey(User, null=True,default=None)
    products = models.ManyToManyField(Product,through='OrderProduct')
    paid = models.BooleanField(default=False)
    total = models.IntegerField(default=0,editable=False,null=True)

    @cached_property
    def total(self):
        x = 0
        for product in self.products.all():
            relationship_queryset = OrderProduct.objects.filter(order=self, product=product)
            for p in relationship_queryset.all():
                 x +=  p.total_products
        return x

class OrderProduct(models.Model):
    order = models.ForeignKey(Order)
    product = models.ForeignKey(Product)
    products_quantity = models.IntegerField(max_length=2)
    products_total = models.IntegerField(default=0,editable=False)

    def save(self, *args, **kwargs):
        self.products_total = (self.product.price * self.products_quantity)
        super(OrderProduct, self).save(*args, **kwargs)

景色

def sales(request):
  today = datetime.utcnow()
  today_sales = m.Order.objects.filter(date=today).all()
  return render_to_response('pages/sales.html',{'request':request,'sales':today_sales})

模板

{% for sale in sales %}
    <ul>{{ sale.date }}|{{ sale.paid }}|{{ sale.total }}</ul>

  !! Here i wanna put the products from the current sale !!
  {% for product in sales.products %}
    {{ product.name }}|{{ product.price }}|{{ product.products_quantity }}|{{ product.products_total }}
  {% endfor %}
{% endfor %}

使用backward relationship:

{% for order_product in sale.orderproduct_set.all %}
    {{ order_product.product.name }}|{{ order_product.product.price }}|{{ order_product.products_quantity }}|{{ order_product.products_total }}
{% endfor %}