TypeError: аргумент float() должен быть строкой или числом, а не ‘Profile’

#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. Спасибо за вашу помощь!