Как эффективно добавлять объекты в ManyToManyFields нескольких объектов Django python?

Как эффективно добавлять объекты в поля ManyToManyFields нескольких объектов?

    def handle(self, *args, **kwargs):
        shops = MyShop.objects.all()
        for shop in shops:
        month_invoice = shop.shop_order.annotate(year=TruncYear('created'), month=TruncMonth('created')).values(
        'year', 'month', 'shop_id'
    ).annotate(total=Sum(ExpressionWrapper(
        (F('item_comission') / 100.00) * (F('price') * F('quantity')), output_field=DecimalField())),
    ).order_by('month')
    for kv in month_invoice:
        a = ShopInvoice.objects.create(shop_id=kv['shop_id'], year=kv['year'], month=kv['month'], total=kv['total'])
        test = shop.shop_order.filter(created__month=kv['month'].month, created__year=kv['year'].year)
        for t in test:
            a.items.add(t.id)

Метод .add() принимает несколько объектов для добавления. Я не смотрел исходный код Django, но ожидал, что если бы была возможна какая-либо оптимизация, то она была бы сделана. Поэтому попробуйте

a.items.add( *[ t.id for t in test ] )

Если у вас установлена Django Debug Toolbar, вы можете очень быстро увидеть, оптимизирована ли она (обычно одна операция над БД вместо N = len(test) )

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