Django - как суммировать два поля модели? [Дубликат]

Попробуйте этот код, он отлично работает

назначает переменную post переменной

   $username = $_POST['uname'];

   $password = $_POST['pass'];

  $result = mysql_query('SELECT * FROM userData WHERE UserName LIKE $username');

if(!empty($result)){

    while($row = mysql_fetch_array($result)){
        echo $row['FirstName'];
     }
}
35
задан Serjik 19 December 2015 в 11:06
поделиться

4 ответа

Обновление: для Django> = 1.8, пожалуйста, следуйте ответам, предоставленным @kmmbvnr

, возможно, используя Django ORM:

вот что вы должны сделать:

from django.db.models import Sum

total = ( Task.objects
            .filter(your-filter-here)
            .aggregate(
                total=Sum('progress', field="progress*estimated_days")
             )['total']
         )

Примечание: если два поля имеют разные типы, скажем integer & amp; float, тип, который вы хотите вернуть, должен быть передан как первый параметр Sum

. Это поздний ответ, но я думаю, что это поможет кому-то искать то же самое.

64
ответ дан sha256 26 August 2018 в 13:30
поделиться

У вас есть несколько вариантов:

  1. Сырой запрос
  2. Недокументированный подход Эмульбре
  3. Создайте третье поле progress_X_estimated_days и обновите его, чтобы сохранить перезаписанный метод. Затем выполните агрегацию через это новое поле.

Перезапись:

class Task(models.Model):
   progress = models.PositiveIntegerField()
   estimated_days = models.PositiveIntegerField()
   progress_X_estimated_days = models.PositiveIntegerField(editable=False)

   def save(self, *args, **kwargs):
      progress_X_estimated_days = self.progress * self.estimated_days
      super(Task, self).save(*args, **kwargs)
2
ответ дан Community 26 August 2018 в 13:30
поделиться

С Django 1.8 и выше вы можете передать выражение в свою совокупность:

 from django.db.models import F

 Task.objects.aggregate(total=Sum(F('progress') * F('estimated_days')))['total']

Также доступны константы, и все можно комбинировать:

 from django.db.models import Value

 Task.objects.aggregate(total=Sum('progress') / Value(10))['total']
50
ответ дан ghickman 26 August 2018 в 13:30
поделиться

Решение зависит от версии Django.

  • django & lt; 1.8
    from django.db.models import Sum
    MyModel.objects.filter(<filters>).aggregate(Sum('field1', field="field1*field2"))
    
  • django> = 1.8
    from django.db.models import Sum, F
    MyModel.objects.filter(<filters>).aggregate(Sum(F('field1')*F('field2')))
    
14
ответ дан Jasonw 26 August 2018 в 13:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: