Django и агрегирование записей о внуках - PullRequest
0 голосов
/ 03 марта 2020

Я новичок в Django, но некоторое время был на RdB. Я наконец-то освоил модель-представление-шаблон. Я немного борюсь с « aggregate » и « annotate », особенно когда в моей модели есть записи потомков и я хочу агрегат.

Я использую Django 3 на Python 3. Вот мой пример настройки, мне нужна помощь, чтобы исправить это. Я всякого рода неправ.

Есть магазинов , каждый из которых обслуживал много пицц , каждая пицца имеет много начинок , каждая использованная начинка другой кол-во предметов. Я хочу знать общее количество долей для каждой сделанной пиццы и общее количество долей для каждого магазина.

models.py

class Parlor(models.Model):
   name = models.CharField(max_length=64)

class Pizza(models.Model):
   name = models.CharField(max_length=64)
   store = models.ForeignKey(Parlor, on_delete=models.CASCADE)

class Topping(models.Model):
   name = models.CharField(max_length=64)
   pizza = models.ForeignKey(Pizza, on_delete=models.CASCADE) 
   qty = models.IntegerField(default=0)

views.py

class ParlorDetail(generic.DetailView):
    model = Parlor
    template_name = 'pizza/parlor_detail.html'
    context_object_name = 'parlor'
    def get_context_data(self, **kwargs):
        context = super(ParlorDetail, self).get_context_data(**kwargs)
        id = self.kwargs['pk']
        topping_qty = Pizza.objects.filter(parlor=id).annotate(sum=Sum('qty')).aggregate(sum=Sum('qty'))
        return context

class PizzaDetail(generic.DetailView):
    model = Pizza
    template_name = 'pizza/pizza_detail.html'
    context_object_name = 'pizza'
    def get_context_data(self, **kwargs):
        context = super(PizzaDetail, self).get_context_data(**kwargs)
        id = self.kwargs['pk']
        topping_qty = Topping.objects.filter(pizza=id).annotate(sum=Sum('qty'))
        return context

parlor_detail. html

{% extends "pizza/my_base.html" %}
{% block content %}
    <div>Parlor: {{ name }}</div>

    <div>Pizzas Made at Parlor</div>

    {% for pizza in pizzas.all %}
      <div>Pizza: {{ pizza.name }}</div>
      <div>Toppings: {{ pizza.topping_qty.sum }}</div>
    {% endfor %}

    <div> Total Qty of Toppings For Parlor: pizzas.topping_qty </div>
{% end block content %}
...