如何根据大小查询前10个目录?

时间:2012-03-14 17:42:03

标签: django django-models django-queryset

我是Django的新手,我正在创建一个简单的应用程序来跟踪磁盘使用情况并显示随时间的变化等等:

class Directory(models.Model):
  path = models.CharField(max_length=200)

class Directory_Size(models.Model):
  drivedir = models.ForeignKey(Directory, related_name = 'sizes')
  measure_date = models.DateTimeField()
  size = models.IntegerField()

Directory_Sizes存储目录的大小和记录的时间。每个目录都会有很多这样的内容。

如何选择目录的当前大小?我需要每个Directory_Size的最新Directory

如何根据大小选择前10个目录,这将是一个简单的大小顺序,然后限制为10,这可以通过链接order_by并限制在上面的查询的顶部来完成?

我应该更改模型以使这类事情变得更容易吗?

我认为这很简单,我不知道是因为我缺乏Django知识。

4 个答案:

答案 0 :(得分:2)

这与您的问题无关,但Django命名标准会告诉您将模型命名为DirectorySize,而不是Directory_Size。你使用 CamelCase或带有下划线的小写,而不是两者(它是xor)。通常,类(以及模型)使用CamelCase命名。函数定义和变量是带有下划线的小写。

来源:https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/

答案 1 :(得分:1)

1)现在我的问题是如何选择目录的当前大小。我需要每个目录的最新Directory_Size。

d = Directory.objects.get( ...
d_size = d.sirectory_size_set.order_by( '-measure_date')[0].size

2)根据尺寸选择前10个目录:我认为您需要自定义raw query

for p in Directory.objects.raw(
    'SELECT *, (select ...) as s FROM myapp_directory order by s LIMIT 10'
)

(select ...)是获得实际大小的子查询,也可以进行加入......

答案 2 :(得分:0)

sizes将返回一个可以执行过滤操作的管理器。所以这个:

last_10_sizes = the_directory.sizes.order_by('-measure_date')[:10]

将返回最新的10种尺寸。

答案 3 :(得分:0)

Directory_Size.objects.all().order_by('-size')[:10]

然而,这是非常粗糙和所有对象。

你也可以在一个测量日期上过滤并给出一个范围,比如

 import datetime
 start_date = datetime.datetime(<values_here>)
 end_date = datetime.datetime(<values_here>) 
    Directory_Size.objects.filter(measure_date__gte=start_date, measure_date__lte=end_date).order_by('-size')[:10]

您是否需要历史数据,为什么不更新相同的目录并使用默认的datetime.datetime.utc_now()进行修改日期?