Saat ini saya memiliki model yang ditunjukkan di bawah ini

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)

Seperti yang Anda lihat, model pesanan memiliki model produk sebagai kunci asing.

Saat saya membuat atau memperbarui instans berdasarkan model pesanan, saya ingin mengurangi satu nilai dari bidang stok di model produk.

Lihat di bawah untuk tampilan saya saat membuat dan memperbarui instance.


@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})

Saya sadar bahwa menggunakan contoh serupa di bawah ini perlu diterapkan, namun saya harus menggunakan kunci utama dari contoh khusus itu.

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

Namun contoh ini tidak akan berlaku saat membuat instance berdasarkan formulir pemesanan.

Bagaimana seseorang bisa menerapkan ini?

0
kamcoder 4 Juli 2020, 12:53

1 menjawab

Jawaban Terbaik

Jika saya tidak salah, Anda mencoba untuk memperbarui Product.stock ketika Pesanan dibuat. Anda dapat menggunakan sinyal untuk ini. Sebagai contoh:

from django.db.models.signals import post_save

@receiver(post_save, sender=Order)
def update_stock(sender, instance, created, **kwargs):
    if created:
        instance.product.stock = instance.product.stock - 1
        instance.product.save()
1
Vincent 4 Juli 2020, 14:27