Доступ к связанным объектам
Я пришел из 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 удачи в развитии питонистики :)