Я хочу выполнить запрос и вернуть список, содержащий уникальное имя объекта и его частоту. Я сталкивался с несколькими постами, объясняющими это, но, похоже, не могу найти статью, в которой используется атрибут имени объекта. например:
powderList = Build.objects.values('powder').annotate(total_count=Count('powder')).order_by('total_count')
возвращает:
{'powder': None, 'total_count': 0}, {'powder': 1, 'total_count': 2}, {'powder': 2, 'total_count': 2}
Что очень близко к тому, что я хочу, однако это отображает id
из powder
. Я хотел бы получить доступ к атрибуту порошка (powder.name
), чтобы он выводил вместо него:
{'powder': None, 'total_count': 0}, {'powder': Titanium, 'total_count': 2}, {'powder': Steel, 'total_count': 2}
Я попытался:
powderList = Build.objects.values('powder.name').annotate(total_count=Count('powder')).order_by('total_count')
powderList = Build.objects.values('powder').annotate(total_count=Count('powder.name')).order_by('total_count')
Мой следующий план - использовать for loop
для перебора диктов и поиска имени по идентификатору, но это будет каждый раз попадать в базу данных. Есть ли более эффективный правильный способ сделать это?
Мои модели выглядят так:
class Build(models.Model): #(DMLS)
PSScustomer = models.ForeignKey(Customer, on_delete=models.CASCADE)
plannedAuthor = models.ForeignKey(CustomUser,related_name='+',blank=True, null= True, on_delete=models.CASCADE)
powder = models.ForeignKey('Powder', null=True, blank=True, on_delete=models.CASCADE)
class Powder(models.Model):
PSScustomer = models.ForeignKey(Customer, on_delete=models.CASCADE)
name = models.CharField(max_length=50,)