Django - Как обновить родительскую модель с помощью дочерней модели?

У меня есть две модели примерно следующего содержания:

models.py

class Parent(models.Model):
  id = models.BigAutoField(primary_key=True)
  quantity = models.DecimalField(max_digits=3, decimal_places=0, null=True)

class Child(models.Model):
  parent = models.ForeignKey('Parent', related_name="parent_child", on_delete=models.CASCADE)
  quantity = models.DecimalField(max_digits=3, decimal_places=0, null=True)

Если родительское количество отличается от суммы дочерних количеств, Обновляет родительское количество до суммы дочерних количеств.

Я попытался получить объект, родительское количество которого отличается от суммы дочерних количеств:

parent = Parents.objects.annotate(sum_quantities=Sum('parent_child__quantity')).exclude(quantity=F('sum_quantities'))

Это работает! Но у меня проблемы с обновлением. Есть ли хороший способ?

Да, вы можете использовать метод update() набора queryset для обновления родительского количества до суммы дочерних количеств:

Parent.objects.annotate(sum_quantities=Sum('parent_child__quantity')).filter(quantity__ne=F('sum_quantities')).update(quantity=F('sum_quantities'))

Это обновит поле количества всех родителей, количество которых отличается от суммы полей количества их детей.

Я решил эту проблему.

Parent.objects.annotate(
    sum_quantities=Sum('parent_child__quantity')).exclude(quantity=F('sum_quantities')).update(
        quantity=Subquery(
            Parent.objects.filter(parent=OuterRef('id')).annotate(sum_quantities=Sum('parent_child__quantity')).values('sum_quantities')[:1]    
        )
    )
)
Вернуться на верх