iMaGiNiX
iMaGiNiX

Reputation: 156

Many to many reversing through relationship in the template

I wanna to access data on reverse relationship, i trying to make a list for all sales on a day, but i don't know the proper way to do the reverse relationship.

  1. There is some method on the templates?
  2. is better do on the View or made some custom filter???

The Models

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)

The view

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})

The template

{% 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 %}

Upvotes: 0

Views: 107

Answers (1)

catavaran
catavaran

Reputation: 45595

Use 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 %}

Upvotes: 1

Related Questions