Добавить к элементам QuerySet - PullRequest
0 голосов
/ 14 января 2019

Модель изделия (представляет продукт, подобный MacBook)

class Item(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=100)
    manufacturer = models.ForeignKey('Manufacturer', blank=True, null=True, on_delete=models.SET_NULL)
    introduction = models.DateField(auto_now=True)
    is_retired = models.BooleanField(default=False)
    tags = models.ManyToManyField(Tag)

    def __str__(self):
        return self.name

OnHand Модель (представляет сериализованный MacBook)

class OnHand(models.Model):
    name = models.CharField(max_length=100)
    serial = models.CharField(max_length=80)
    asset = models.CharField(max_length=20)
    product = models.ForeignKey(Item, blank=True, null=True, on_delete=models.CASCADE)
    tags = models.ManyToManyField(Tag)

    def __str__(self):
        return self.serial

Индекс enter image description here

Индексная функция

def index(request):
    items = Item.objects.all()
    context = {
        'items':items,  
    }
    print(items)
    return render(request, 'index.html', context)

Template / таблица

<table class="table table-hover">
  <thead class="thead-light">
    <tr>
      <th>Item Id</th>
      <th>Title</th>
      <th>Manufacturer</th>
      <th>On Hand</th>
      <th>Category Id</th>
    </tr>
  </thead>

  <tbody>
    {% for item in items %}
    <tr>
      <td>{{ item.pk }}</td>
      <td>{{ item.name }}</td>
      <td>{{ item.manufacturer }}</td>
      <td>{{ item.quanity }}</td>
    </tr>

    {% endfor %}
    </tbody>
</table>

Это приложение представляет собой систему управления запасами, которая может принимать элементов , таких как MacBook Pro или iPhone 6, и OnHands , которые являются сериализованными экземплярами этих элементов. В моей индексной функции я передаю результат all() запроса в индексное представление в контексте .

Я могу запросить OnHand.objects.filter(product_id=item.pk), чтобы получить количество каждого Предмета , однако, в моем текущем способе работы я не уверен, как передать это значение внешнему интерфейсу, сохраняя при этом его взаимосвязь если это имеет смысл.

Я бы хотел, чтобы item.quanity по существу представлял количество этого конкретного предмета. Что я ищу? Сначала я хотел добавить QuerySet, но я не уверен, как это сделать.

1 Ответ

0 голосов
/ 14 января 2019

Вы ищете аннотировать .

from django.db.models import Count
items = Item.objects.annotate(
    quantity=Count('onhand_set__id'),
)

В зависимости от вашего использования может потребоваться передать distinct=True на Count.

...