Я пытаюсь выполнить итерации по каждому экземпляру модели, которую я определил.

Допустим, у меня есть следующее в models.py, в приложении people django:

class foo(models.Model):
    name = models.CharField(max_length=20, default="No Name")
    возраст = models.PositiveSmallIntegerField(default=0)

И я заполнил базу данных, чтобы иметь следующие данные в foo:

  1. имя="Чарли", возраст=17 лет
  2. имя="Мэтью", возраст=63
  3. имя="Джон", возраст=34

Сейчас я хочу вычислить средний возраст моего набора данных. В другой части программы (вне приложения people, в папке project), в файле bar.py, который будет настроен на автоматический запуск каждый день в определенное время, я вычисляю это среднее значение.

from people.models import foo
def findAverageAge():
    total = 0
    for instance in //Что здесь происходит?
        total += instance.age
    length = //Что здесь происходит, чтобы найти количество экземпляров?
    average = total / length
    вернуть среднее значение
print(findAverageAge)

В приведенном выше коде //What goes here?// означает, что я не знаю, что здесь находится, и мне нужна помощь.

H4KKR

Ответов: 1

Ответы (1)

Вы можете получить все элементы с помощью .all() [Django-doc]:

.
from people.models import foo

def findAverageAge():
    total = 0
    qs = foo.objects.all()
    for instance in :
        total += instance.age
    length = len(qs)
    average = total / length
    return average

print(findAverageAge())

Но вам не следует вычислять среднее значение на уровне Django/Python. Это требует извлечения всех записей, а они могут быть довольно большими. База данных сама может вычислить среднее значение, и это (обычно) делается более эффективным способом. Вы можете .aggregate(...) [jango-doc] на наборе запросов с помощью:

from people.models import foo

def findAverageAge():
    return foo.objects.aggregate(
        avg_age=Avg('age')
    )['avg_age'] or 0

print(findAverageAge())

Вам следует сделать команду управления, однако: это загрузит приложения Django, а также сделает более удобным запуск команды с параметрами и т.п.

.

2022 WebDevInsider