Как написать QuerySet для Django, чтобы получить количество моделей - PullRequest
0 голосов
/ 14 апреля 2020

Model.py

class InventoryData (models.Model):

AssetID = models.CharField('Asset ID', max_length=30, unique=True)
SerialNumber = models.CharField('Serial Number', max_length=30, unique=True)
Make = models.CharField(max_length=30, blank=True, null=True)
Model = models.CharField(max_length=30, blank=True, null=True)

class Meta:
    verbose_name = 'Inventory Data'
    verbose_name_plural = 'Inventory Data'

def __str__(self):
    return self.AssetID

Views.py

def home (запрос):

obj = InventoryData
# ----- For Models ----- #
stnd = obj.objects.filter(AssetID__startswith='ASPL-LAPT').order_by('Model').values_list('Model', 
flat=True).distinct()
dev = obj.objects.filter(AssetID__startswith='ASPLB-DEV').order_by('Model').values_list('Model', 
flat=True).distinct()
mac = obj.objects.filter(Make__startswith='Apple').order_by('Model').values_list('Model', 
flat=True).distinct()
desk = obj.objects.filter(AssetID__startswith='ASPLB-DSK').order_by('Model').values_list('Model', 
flat=True).distinct()

# ----- For Counts ----- #

cnt = obj.objects.filter(Model__in=mac).distinct().count()  

context = {'stnd': stnd, 'dev': dev, 'mac': mac, 'desk': desk, 'cnt': cnt, }

return render(request, 'App/home.html', context)

это вывод, который я получаю:

в моей БД у меня есть Make as Apple, Lenovo и Model as 4 модели [ MacBook Pro 13.0 ", MacBook Pro 15.0" , T440, T450, T540p ], каждая модель имеет 10 ноутбуков, но когда я считаю, я получаю общее количество как 20 для Ма c Книга и считать как 30 для ноутбуков Lenovo мне нужно считать для каждой модели

MacBook Pro 13,0 "- 10 MacBook Pro 15,0" - 10 T440 - 10 T450 - 10 T540p - 10

с ниже запроса я получаю таблицу ниже,

cnt = obj.objects.filter (Model__in = ma c). count ()

Пожалуйста, помогите мне, как написать запрос для таблицы 2

Table1

Table2

1 Ответ

1 голос
/ 14 апреля 2020

Я думаю, что простая группа по выдаст ваши цифры:

from django.db.models import Count

stnd = obj.objects.filter(AssetID__startswith='ASPL-LAPT').values('Model').annotate(count=Count('Model'))

dev = obj.objects.filter(AssetID__startswith='ASPLB-DEV').values('Model').annotate(count=Count('Model'))

mac = obj.objects.filter(Make__startswith='Apple').values('Model').annotate(count=Count('Model'))

desk = obj.objects.filter(AssetID__startswith='ASPLB-DSK').values('Model').annotate(count=Count('Model'))

context = {'stnd': stnd, 'dev': dev, 'mac': mac, 'desk': desk, }


return render(request, 'App/home.html', context)

# Template

{% for key, value in mac.items %}
    {{ key }}: {{ value }}
{% endfor %}

Это должно выглядеть примерно так:

Model: MacBook Pro 13.0
count: 10

Model:  MacBook Pro 15.0
count: 10

Было бы намного проще, если бы у вас был лучший способ определить, что это за продукт. Как, например, если бы вы могли определить производителя продукта по Make, вы могли бы сгруппировать по нескольким столбцам:

obj.objects.values('Make', 'Model').values(count=Count('Model'))
...