Wednesday, 15 May 2013

Django queryset - filter/exclude by sum over column -



Django queryset - filter/exclude by sum over column -

for little caching application have next problem/question:

part of model:

class cachedresource(models.model): ... filesize = models.positiveintegerfield() created = models.datetimefield(auto_now_add=true, editable=false) ...

the cache should e.g. limited 200mb - , maintain newest files.

how can create queryset like:

cachedresource.objects.order_by('-created').exclude(" summary of filesize < x ")

any input appreciated!

example:

created filesize keep/delete? 2014-06-22 15:00 50 maintain (sum: 50) 2014-06-22 14:50 100 maintain (sum: 150) 2014-06-22 14:40 30 maintain (sum: 180) 2014-06-22 14:30 20 maintain (sum: 200) 2014-06-22 14:20 50 delete (sum: 250 > 200) 2014-06-22 14:10 10 delete ... 2014-06-22 14:00 200 delete ... 2014-06-22 13:50 10 delete ... 2014-06-22 13:40 2 delete ... ... ... ... ...

each object in next queryset have 'filesize_sum' attribute holding summary of filesizes of cache resources created since object's creation time.

qs = cachedresource.objects.order_by('-created').extra(select={ 'filesize_sum': """ select sum(filesize) cachedresource_table_name cr cr.created >= cachedresource_table_name.created """})

then can create loop want. example, create loop breaks on first object filesize_sum > 200mb , run delete query on queryset objects smaller or equal creation date object:

for obj in qs: if obj.filesize_sum > 200: qs.filter(created__lte=obj.created).delete() break

keep in mind though want take action before inserting new cache resource, filesize of new resource not exceed limit. example, run above procedure with:

limit = configured_limit - filesize_of_cache_resource_to_insert

django django-models django-queryset

No comments:

Post a Comment