Как запросить топ-10 каталогов в зависимости от размера? - PullRequest
0 голосов
/ 14 марта 2012

Я новичок в Django, и я создаю простое приложение для отслеживания использования диска и отображения изменений во времени и т. Д.:время было записано.Их будет много для каждого Справочника.

Как выбрать текущий размер справочника?Мне нужны самые новые Directory_Size для каждого Directory.

Как бы я выбрал 10 лучших каталогов в зависимости от размера, это был бы простой порядок по размеру, а затем ограничение до 10, можно ли*

Стоит ли менять модели, чтобы упростить этот тип вещей?

Я предполагаю, что это просто, и я не понимаюне знаю как из-за моего недостатка знаний о Джанго.

Ответы [ 4 ]

2 голосов
/ 14 марта 2012

Это не относится к вашим вопросам, но стандарты именования Django говорят, что вы должны назвать модель DirectorySize, а не Directory_Size. Вы используете или CamelCase или строчные буквы с подчеркиванием, а не оба (это xor). Как правило, классы (и, следовательно, модели) именуются с использованием CamelCase. Определения функций и переменные в нижнем регистре с подчеркиванием.

источник: https://docs.djangoproject.com/en/dev/internals/contributing/writing-code/coding-style/

1 голос
/ 14 марта 2012

1) Теперь у меня вопрос, как мне выбрать текущий размер каталога. Мне нужен новейший размер_каталога для каждого каталога.

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

2) выберите 10 лучших каталогов в зависимости от размера: я думаю, вам нужен пользовательский необработанный запрос .

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

Где (select ...) - это подзапрос для получения фактического размера, также вы можете выполнить объединение ...

0 голосов
/ 14 марта 2012
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 ()?

0 голосов
/ 14 марта 2012

sizes вернет менеджера, на котором вы можете выполнять операции фильтрации.Так вот:

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

вернет последние 10 размеров.

...