簡體   English   中英

Django:下單時如何減少庫存?

[英]Django: How to reduce stock quantity when an order is made?

我的目標是在創建訂單時減少庫存數量。 我的庫存商品是輪胎。 輪胎有一個 model 字段用於數量。

這是我的意見.py

from django.shortcuts import render, redirect
from .models import OrderItem
from .forms import OrderCreateForm
from cart.cart import Cart
from stock.models import Tyre, Branch 
from django.contrib.auth.decorators import login_required


@login_required(login_url="/accounts/login/")
def order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        if form.is_valid():
            order = form.save()
            for item in cart:
                OrderItem.objects.create(
                    order=order,
                    tyre=item['tyre'],
                    price=item['price'],
                    quantity=item['quantity']
                )

                # reduce tyre stock quantity
                order_item = OrderItem.objects.get(id=id)
                tyre = Tyre.objects.get(id=id)
                tyre.quantity = tyre.quantity - order_item.quantity
                tyre.save()
           

            cart.clear()

            return redirect('orders:sale-orders')
        # return render(request, 'orders/sale_orders.html', {'order': order})
    else:
        form = OrderCreateForm()
    return render(request, 'orders/create_order.html', {'form': form})

當我運行代碼時,我收到了這個錯誤:/orders/create/ Field 'id' 的 TypeError 需要一個數字,但得到了。

這是我的訂單應用程序的models.py:

from django.db import models
from shop.models import Product

class Order(models.Model):
    customer_name = models.CharField(max_length=60)
    contact = models.CharField(max_length=12)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('-created', )

    def __str__(self):
        return 'Order {}'.format(self.id)

    def get_total_cost(self):
        return sum(item.get_cost() for item in self.items.all())


class OrderItem(models.Model):
    order = models.ForeignKey(Order, related_name='items', on_delete=models.CASCADE)
    tyre = models.ForeignKey(Tyre, related_name='order_items', on_delete=models.CASCADE)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    quantity = models.PositiveIntegerField(default=1)

    def __str__(self):
        return '{}'.format(self.id)

    def get_cost(self):
        return self.price * self.quantity

我很感激任何幫助

看起來您正在使用 python 的內置 id function 來執行對 OrderItem model 的 id 字段的分配。 您的代碼中似乎缺少某些內容。 您打算在哪里獲取 id kwarg 的值order_item = OrderItem.objects.get(id=id)

不確定這是否可行

from django.shortcuts import render, redirect
from .models import OrderItem
from .forms import OrderCreateForm
from cart.cart import Cart
from stock.models import Tyre, Branch 
from django.contrib.auth.decorators import login_required


@login_required(login_url="/accounts/login/")
def order_create(request):
    cart = Cart(request)
    if request.method == 'POST':
        form = OrderCreateForm(request.POST)
        if form.is_valid():
            order = form.save()
            for item in cart:
                order_item = OrderItem.objects.create(
                    order=order,
                    tyre=item['tyre'],
                    price=item['price'],
                    quantity=item['quantity']
                )

                # reduce tyre stock quantity
                tyre = Tyre.objects.get(id=item.id)

                # Not sure if item['tyre'] is an instance of tyre
                # other wise `tyre = item['tyre']` Could also work to replace
                # `tyre = Tyre.objects.get(id=item.id)`

                tyre.quantity = tyre.quantity - order_item.quantity
                tyre.save()
           

            cart.clear()

            return redirect('orders:sale-orders')
        # return render(request, 'orders/sale_orders.html', {'order': order})
    else:
        form = OrderCreateForm()
    return render(request, 'orders/create_order.html', {'form': form})

羅傑斯上面所說的非常接近。 獲取輪胎 id 的行tyre = Tyre.object.get(id=order_item.tyre.id)解決了所有問題。

謝謝羅傑

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM