У меня есть 2 модели, Элемент , который представляет продукт, и OnHand , который представляет каждый отдельный сериализованный продукт. Они связаны с ForeignKey product_id .
Модель товара:
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:
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)
def __str__(self):
return self.serial
В моем представлении Index у меня есть таблица, которая показывает эти продукты и подсчитывает количество. Для этого мне нужно подсчитать количество OnHand объектов с совпадающим product_id .
Индекс:
def index(request):
items = Item.objects.all()
quanity = count_onhand(items)
context = {
'items':items,
}
print(items)
return render(request, 'index.html', context)
count_onhand:
def count_onhand(items):
for item in items:
count = OnHand.objects \
.filter(product_id=item.product_id) \
.count()
Поскольку они идут в том же виде и должны поддерживать свой порядок, я подумал, что наилучшим направлением будет добавление в набор запросов Item и добавление в список, который я отправлю обратно с оригиналом Элемент с добавленным количеством.
РЕДАКТИРОВАТЬ: я обнаружил, что вышеупомянутое не было бы мудрым подходом, но оставить его там для контекста.
То, что я хочу сделать, это получить счетчик всех OnHand объектов, которые связаны с данным Item . prefetch_related()
кажется близким к тому, что я хочу, но, похоже, работает только со многими ко многим (насколько мне известно).
Я могу использовать OnHand.objects.filter(product_id=item.pk).count()
, но я не уверен, что это самый стандартный подход.