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