Django подсчитывает все дочерние модели от родителя в одном запросе - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь сосчитать всех детей из родительской модели, но не могу заставить ее работать.

См. Ниже мою модель и вещи, которые я попробовал.

Модель

class ParentXX(models.Model):
    created = models.DateTimeField(auto_now_add=True, null=True)
    last_updated = models.DateTimeField(auto_now=True)
    name = models.CharField(max_length=200,null=False,blank=False,unique=True)

class ChildrenXX(models.Model):
    created = models.DateTimeField(auto_now_add=True, null=True)
    last_updated = models.DateTimeField(auto_now=True)
    name = models.CharField(max_length=200,null=False,blank=False,unique=True)
    parent_sample = models.ForeignKey(ParentXX,
                                      models.CASCADE,
                                      blank=False,
                                      null=False,
                                      related_name='child_sample')

код

cnt = ParentXX.objects.filter(name="xx").annotate(c_count=Count('child_sample')) #Not working
cnt = ParentXX.objects.filter(name="xx").annotate(c_count=Count('parent_sample')) #Not working
print(c_count)

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Вы создаете свойство для каждого из отфильтрованных значений. Чтобы получить количество дочерних элементов для определенного элемента в наборе запросов, вам нужно сослаться на эту аннотацию.

qs = ParentXX.objects.filter(name="xx").annotate(c_count=Count('child_sample')) 

cnt1 = qs[0].c_count
cnt2 = qs[1].c_count
#...

Я не уверен, что это лучший способ, но вы могли бы просто пройтись по набору запросов и суммировать все значения.

count = 0
for q in qs:
  count += q.c_count
0 голосов
/ 11 июля 2019

Ваш код должен быть:

cnt = ParentXX.objects.filter(name="xx").annotate(c_count=Count('child_sample')) 
cnt = ChildrenXX.objects.filter(name="xx").annotate(c_count=Count('parent_sample')) 

'cnt' является объектом QuerySet, если вы хотите получить 'c_count', вы можете:

print(cnt[0].c_count)
...