Доступ к связанным объектам

Я пришел из Java и новичок в python / django. Поэтому, возможно, мой вопрос глупый...

У меня есть один класс Parent, который содержит ассоциацию с классом Child.

class Parent(models.Model):
    pass
    
class Child(models.Model):
    value = models.DecimalField(decimal_places=2, max_digits=12,default=0.0);
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE, null=True, related_name='children')

Parent обращается к своим "детям" через связанное имя "children". Во время выполнения это работает хорошо, но во время проектирования это недостижимо из объявления класса Parent.

Если я хочу, чтобы родитель получил суммарное значение своих детей, лучший вариант, который я нашел, это сначала получить набор детей, а затем суммировать из него

class Parent(models.Model):
@property
def total_value(self):
    return float(Child.objects.filter(parent=self).aggregate(Sum('value'))['value__sum']) or 0.00
pass

Знаете ли вы, есть ли лучший способ сделать это? Нельзя ли представить что-то вроде:

children.aggregate(Sum('value'))

Другими словами: возможно ли получить прямой доступ к дочерним элементам из родительского элемента (во время проектирования) без выполнения запроса?

Заранее спасибо за поддержку в этом вопросе.

Вы всегда можете относиться одинаково к этим двум:

Child.objects.filter(parent=self)
self.children.all()

но сначала вы должны иметь некоторый объект Parent. Внутри методов класса Parent это self, иначе это что-то вроде:

parent = Parent.objects.get(id=1)
parent.children.all()

так что в основном это должно работать:

self.children.all.aggregate(Sum('value'))['value__sum']   # It might work even without 'all', but I am not sure about that one

PS удачи в развитии питонистики :)

Вернуться на верх