def _add(self, cart: Cart, product: Product, quantity: int): for product_item in product.items.filter( quantity__gt=0, latest_delivery_date__gt=datetime.datetime.utcnow().date( )).order_by("latest_delivery_date"): item_quantity = (quantity if quantity <= product_item.quantity else product_item.quantity) cart_item, created = CartItem.objects.get_or_create( cart=cart, product=product, latest_delivery_date=product_item.latest_delivery_date, defaults={ "quantity": item_quantity, "delivery_option": product.first_available_delivery_option(), }, ) if not created: cart_item.quantity += item_quantity cart_item.save() product_item.quantity -= item_quantity if product_item.quantity == 0: product_item.delete() else: product_item.save() quantity -= item_quantity if quantity == 0: break # TODO: bulk save? return quantity