измените набор запросов просмотра списка, чтобы суммировать таблицу, содержащую столбцы с одинаковым значением - PullRequest
0 голосов
/ 26 сентября 2019

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

для примера:

stocks_table:

name    packing_details    expiry_date    quantity
milk    1lt boxes          11/11/2019     30
milk    1lt boxes          12/12/2019     40

after modifiying the queryset :

name    packing_details    quantity
milk    1lt boxes          70

возможно ли с общим списком илия должен подготовить представление на основе функции?

Модели

class Material(models.Model):

    name = models.CharField(max_length=500)
    packing_details = models.CharField(max_length=500)
    material_unit = models.CharField(max_length=3)
class Stock(models.Model):
    material = models.ForeignKey(Material, on_delete=models.CASCADE)
    expiry_date = models.DateField()
    quantity = models.DecimalField(max_digits=10, decimal_places=2)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    date_created = models.DateField(default=timezone.now)
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, default=1)

Просмотр

class StocksListView(LoginRequiredMixin, ListView):
    model = Stock
    context_object_name = 'stocks'

Шаблон

            {% for stock in stocks %}
                <tr>
                    <td class="text-center">{{ stock.material.name }}</td>
                    <td class="text-center">{{ stock.material.packing_details }}</td>
                    <td class="text-center">{{ stock.quantity }}</td>
                    <td class="text-center">{{ stock.price }}</td>
                </tr>
            {% endfor %}

1 Ответ

1 голос
/ 26 сентября 2019

Где бы вы ни делали это, вам действительно нужно перевернуть запрос;вам нужно получить список материалов и суммировать их запасы.

Итак:

from django.db.models import Sum

Material.objects.annotate(quantity=Sum('stock__quantity')).filter(quantity__gt=0)

Вы можете установить это непосредственно как набор запросов в представлении:

class StocksListView(LoginRequiredMixin, ListView):
    queryset = Material.objects.annotate...

Вам нужно будет обновить свой шаблон сейчас, когда вы начинаете с материала, а не со склада.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...