简体   繁体   English

Django:下单时如何减少库存?

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

My goal is to reduce stock quantity when an order is created.我的目标是在创建订单时减少库存数量。 My stock item is a Tyre.我的库存商品是轮胎。 The tyre has a model field for quantity.轮胎有一个 model 字段用于数量。

Here is my views.py这是我的意见.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})

When i run the code, I got this error: TypeError at /orders/create/ Field 'id' expected a number but got.当我运行代码时,我收到了这个错误:/orders/create/ Field 'id' 的 TypeError 需要一个数字,但得到了。

Here is my models.py for the orders app:这是我的订单应用程序的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

I appreciate any help我很感激任何帮助

Looks like you are using python's inbuilt id function to perform the assignment to the id field of the OrderItem model.看起来您正在使用 python 的内置 id function 来执行对 OrderItem model 的 id 字段的分配。 Something seems to be missing in your code.您的代码中似乎缺少某些内容。 Where do you intend to get the value for the id kwarg in order_item = OrderItem.objects.get(id=id)您打算在哪里获取 id kwarg 的值order_item = OrderItem.objects.get(id=id)

Not sure if this would work不确定这是否可行

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

What Rogers stated above is very close.罗杰斯上面所说的非常接近。 The line for getting tyre id tyre = Tyre.object.get(id=order_item.tyre.id) That solves everything.获取轮胎 id 的行tyre = Tyre.object.get(id=order_item.tyre.id)解决了所有问题。

Thanks Roger谢谢罗杰

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM