Получить количество связанных моделей - PullRequest
0 голосов
/ 13 января 2019

У меня есть 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(), но я не уверен, что это самый стандартный подход.

1 Ответ

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

То, что я хочу сделать, это получить количество всех объектов OnHand, которые связаны с данным элементом.

Просто используйте API запроса:

some_item.onhand_set.count()

Если вы хотите количество для набора или предметов:

from django.db.models import Count
items = ( Item
         .objects
         .filter( some condition )
         .annotate(num_onhand=Count('onhand'))
         )

Больше образцов в Документация агрегации Джанго

...