Saturday, July 1, 2017

Re: Trouble with annotate().values(somefield).annotate(Sum())

This seems to work
Node.objects.values('cluster').annotate(volume_left=min(F('cluster__volume_limit')-F('cluster__volume_count'), Sum(F('volume_limit')-F('volume_count'))))

<QuerySet [{'cluster': 1, 'volume_left': 8}, {'cluster': 1, 'volume_left': 8}, {'cluster': 2, 'volume_left': 20}, {'cluster': 2, 'volume_left': 20}]>


Do I have it right? Just wanted to confirm.

Thanks


On Saturday, July 1, 2017 at 5:41:20 PM UTC-7, sarvi wrote:

Django Verion:  1.11.1

My models

class Cluster(models.Model):

....

    volume_limit = models.IntegerField('Cluster Volume Count Limit')

    volume_count = models.IntegerField('Cluster Volume Count', default=0)

....


class Node(models.Model):

    cluster = models.ForeignKey(Cluster, related_name='cluster_nodes', on_delete=models.PROTECT)

    volume_limit = models.IntegerField('Node Volume Count Limit')

    volume_count = models.IntegerField('Node Volume Count', default=0)


My query

nodes = Node.objects.filter(....)

intermediatestep = nodes.objects.annotate(volume_left=F('volume_limit')-F('volume_count')).values('cluster__id').annotate(cluster_volume_left_sum=Sum('volume_left'))


Error:

  File "/Users/sarvi/virtenv/toothless/lib/python2.7/site-packages/django/db/models/expressions.py", line 471, in resolve_expression

    return query.resolve_ref(self.name, allow_joins, reuse, summarize)

  File "/Users/sarvi/virtenv/toothless/lib/python2.7/site-packages/django/db/models/sql/query.py", line 1481, in resolve_ref

    return Ref(name, self.annotation_select[name])

KeyError: 'volume_left'


My ultimate Goal: 

    What I am trying to achieve is to get from a

    1. filtered query of Nodes, to calculate volume_left=F('volume_limit')-F('volume_count') for each node

    2. then group by cluster and sum up what volume_left in each node to cluster_volume_left_sum for each cluster. 

    3. Then get a cluster level cluster_volume_left=F('volume_limit')-F('volume_count'),

    4. Then calculate at the cluster level Min(0, F('cluster_volume_left')-F('volume_left__sum'))


I am obviously stuck way earlier :-)


From what I read of the documentation and Stackoverflow this should be possible


Any pointer on what I am doing wrong here would be of great help.


Thanks,

Sarvi

--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/a07a76b5-9ae1-4008-a6fc-0515b1c38c3c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

No comments:

Post a Comment