Django - Можете ли вы использовать свойство как поле в функции агрегирования? - PullRequest
19 голосов
/ 18 июня 2010

Я знаю короткий ответ, потому что я попробовал это. Есть ли способ сделать это (хотя бы только из-за взлома)?

class Ticket(models.Model):
    account = modelfields.AccountField()
    uuid = models.CharField(max_length=36, unique=True)
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['created']

    @property
    def repair_cost(self):
        # cost is a @property of LineItem(models.Model)
        return self.lineitem_set.aggregate(models.Sum('cost'))

Ответы [ 2 ]

22 голосов
/ 18 июня 2010

Нет. Все, что проходит через встроенный менеджер, должно быть реальным полем, поскольку оно касается только базы данных. Для работы со свойством им нужно будет превратить каждую запись в таблице в модель, а затем отфильтровать их в Python.

4 голосов
/ 20 июня 2016

У меня похожий сценарий, и я хочу точно такую ​​же функцию.Я решил это тривиально с помощью следующей строки:

...
return sum(lt.cost for lt in self.lineitem_set)
...