Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django queryset-按列和过滤/排除_Django_Django Models_Django Queryset - Fatal编程技术网

Django queryset-按列和过滤/排除

Django queryset-按列和过滤/排除,django,django-models,django-queryset,Django,Django Models,Django Queryset,对于小型缓存应用程序,我有以下问题: 模型的一部分: class CachedResource(models.Model): ... filesize = models.PositiveIntegerField() created = models.DateTimeField(auto_now_add=True, editable=False) ... 缓存应限制在200MB,并保留最新的文件 如何创建查询集,如: CachedResource.objects.

对于小型缓存应用程序,我有以下问题:

模型的一部分:

class CachedResource(models.Model):
    ...
    filesize = models.PositiveIntegerField()
    created = models.DateTimeField(auto_now_add=True, editable=False)
    ...
缓存应限制在200MB,并保留最新的文件

如何创建查询集,如:

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

也许有更好的方法可以做到这一点:

cachedResources = CachedResource.objects.order_by('-created')
list_of_items = []
size_of_files = 0
for item in cachedResources:
    if size_of_files < 200:
        list_of_items.append(item.id)
    else
        break
cached_resources_by_size = CachedResource.objects.filter(id__in=list_of_items).order_by('-created')
cachedResources=CachedResource.objects.order_by('-created'))
项目列表=[]
_文件的大小=0
对于cachedResources中的项:
如果文件的大小小于200:
列出\u项。追加(item.id)
其他的
打破
cached\u resources\u by\u size=CachedResource.objects.filter(id\u in=list\u of \u items)。排序依据('-created')
totals=CachedResource.objects.values('id')。聚合(sum=sum('filesize'),count=count('id'))
num_to_keep=总计['count']*min(最大文件大小/总计['sum'],1)
而num_to_keep

第1行中的聚合可以获得单个查询中的总文件大小和条目数。根据这些结果,很容易计算出要保留的条目的大致数量。你可以做一些额外的检查来断言这个近似值在一定的范围内(正如你所说的+/-20%)。然后,一个简单的
order\u by
和一个slice将生成一个要删除的所有条目的查询集

以下查询集中的每个对象都有一个“filesize\u sum”属性,该属性保存自该对象创建以来创建的所有缓存资源的文件大小摘要

qs = CachedResource.objects.order_by('-created').extra(select={
  'filesize_sum': """
   SELECT
     SUM(filesize)
   FROM
     CachedResource_table_name as cr
   WHERE
     cr.created >= CachedResource_table_name.created
     """})
然后你可以做一个循环来做你想做的事情。例如,您可以在filesize_sum>200MB的第一个对象上创建一个中断循环,并在queryset上对创建日期小于或等于该对象的所有对象运行删除查询:

for obj in qs:
   if obj.filesize_sum > 200:
       qs.filter(created__lte=obj.created).delete()
       break
请记住,在插入新的缓存资源之前,您可能还想采取一些措施,以便新资源的文件大小不会超过您的限制。例如,您可以使用以下命令运行上述过程:


limit=configured\u limit-filesize\u of\u cache\u resource\u\u to\u insert

:)是的,如果没有其他解决方案,我也会一起解决这个问题。。。但它的效率非常低。想想看,限制不是200MB,而是1TB——以及~1kb大小的文件……你是对的,这可能是个问题。。。我将考虑更好的解决方案确切的累积文件大小为200MB(或1TB)有多重要?一个近似值难道不够吗?是的,完全足够。比如说+/-20%。。。
qs = CachedResource.objects.order_by('-created').extra(select={
  'filesize_sum': """
   SELECT
     SUM(filesize)
   FROM
     CachedResource_table_name as cr
   WHERE
     cr.created >= CachedResource_table_name.created
     """})
for obj in qs:
   if obj.filesize_sum > 200:
       qs.filter(created__lte=obj.created).delete()
       break