#python #django #model
#python #django #Модель
Вопрос:
Проблема:
Я пытаюсь получить последнее значение из моей модели Profile
. Но я столкнулся с проблемой, когда я пытаюсь сохранить его в переменную как значение с плавающей точкой, я получаю эту ошибку TypeError: float() argument must be a string or a number, not 'Profile'
. Мне это нужно, чтобы я мог выполнять вычисления с данными.
Models.py файл:
class Profile(models.Model):
weight = models.FloatField()
height = models.FloatField()
bmi = models.FloatField(null=True)
date = models.DateField(auto_now_add=True)
user = models.ForeignKey(User, default=None, on_delete=models.CASCADE)
def __str__(self):
return self.user.username
Views.py файл (соответствующие части):
weight = float(Profile.objects.latest('weight'))
height = float(Profile.objects.latest('height'))
bmi = (weight/(height**2))
Я искал этот код ошибки здесь, но я не нашел ни одного, где ppl хотел преобразовать из obj
в float
Комментарии:
1. Он возвращает весь экземпляр профиля, поэтому вы должны получить доступ к его свойству. вес и т. Д. docs.djangoproject.com/en/3.1/topics/db/queries
Ответ №1:
Выражение:
Profile.objects.latest('weight')
Не возвращает значение с плавающей запятой, оно возвращает значение Profile
с наибольшим weight
значением. Но не сам вес.
Однако вы можете легко получить оба значения с помощью .aggregate(…)
[Django-doc]:
from django.db.models import Max
result = Profile.objects.aggregate(
max_weight=Max('weight'),
max_height=Max('height')
)
weight = result['max_weight']
height = result['max_height']
bmi = weight / (height * height)
Обратите внимание, что это не сам по себе человек с самым большим ИМТ. Он просто будет искать наибольший вес и высоту из всех Profile
s. (Очень) вероятно, что данные будут исходить из двух разных Profile
файлов.
Если вы хотите рассчитать ИМТ a Profile
, вы можете использовать:
profile = Profile.objects.get(pk=my_pk)
bmi = profile.weight / (profile.height * profile.height)
Вы можете получить Profile
с наибольшим первичным ключом pk
:
profile = Profile.objects.latest('pk')
bmi = profile.weight / (profile.height * profile.height)
но сам по себе это не последний добавленный объект.
Комментарии:
1. @Monard: ну, такого понятия, как последнее значение, не существует. База данных может возвращать записи во всех возможных порядках. Вы можете получить
Profile
с наибольшимpk
, с последним фрагментом кода. Однако лучше добавить временную метку с датой создания, поскольку это единственный надежный способ получить последний объект.2. Спасибо за вашу помощь!