减少外键模型中的值(创建或更新实例时)

时间:2020-07-04 09:53:49

标签: python django django-models django-views

我目前有如下所示的模型

class Product(models.Model):

    name = models.CharField(max_length=200, null=True)
    stock = models.CharField(max_length=200, null=True)
    


class Order(models.Model):
    product = models.ForeignKey(Product, null=True, on_delete = models.SET_NULL)

您会看到订单模型将产品模型作为外键。

当我基于订单模型创建或更新实例时,我想从产品模型的库存字段中减少一个值。

创建和更新实例时,我的观点请参见下文。


@login_required
def newOrder(request):
    form = CreateOrderForm()
    if request.method == 'POST':
        form = CreateOrderForm(request.POST or None)
        if form.is_valid():
            form.save()
            return redirect('customer_order_list')

    return render(request, 'accounts/new_order.html', {'form': form})


@login_required
def editOrder(request, pk):
    order = Order.objects.get(id=pk)
    sho = Order.objects.all().values_list('date_created')
    order_date = sho.filter(id=pk)
    form = CreateOrderForm(instance=order)

    if request.method == "POST":
        form = CreateOrderForm(request.POST, instance=order)
        if form.is_valid():
            form.save()
            return redirect('customer_order_list')

    return render(request, 'accounts/edit_order.html', {'form': form, 'order_date': order_date})

我知道将需要使用以下类似示例,但是我将不得不使用该特定实例的主键。

with transaction.atomic():
    product = (
        Product.objects
        .select_for_update()
        .get(id=1)
    )
    product.inventory -= 1
    product.save()

但是,此示例不适用于基于订单表单创建实例。

如何实现呢?

1 个答案:

答案 0 :(得分:1)

如果我没记错的话,您正在尝试在下订单时更新Product.stock。您可以为此使用signals。例如:

Nearby Pharmacies