【问题标题】:Django model_name.item.add(item) add item to all records in the modelDjango model_name.item.add(item) 将项目添加到模型中的所有记录
【发布时间】:2020-10-24 21:31:19
【问题描述】:

我正在尝试使用 Django 实现电子商务网站的订单系统。我有 Order Model 和 OrderItem Model 这样的

class OrderItem(models.Model):
    product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
    is_ordered = models.BooleanField(default=False)
    owner = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    date_added = models.DateTimeField(auto_now=True)
    date_ordered = models.DateTimeField(null = True)

    def __str__(self):
        return self.product.name

class Order(models.Model):
    ref_code = models.UUIDField(default=uuid.uuid4, editable=False)
    items = models.ManyToManyField(OrderItem)
    owner = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True)
    is_ordered = models.BooleanField(default=True)
    date_ordered = models.DateTimeField(auto_now=True)
    shipping = models.ForeignKey(AddressAndInfo, on_delete=models.SET_NULL, null=True)
    is_shipped = models.BooleanField(default=False)
    price = models.FloatField(default=0.0)

而我的视图函数是这样的:

def checkout(request):
order_items = OrderItem.objects.filter(
    owner=request.user).filter(is_ordered=False).all()

address = AddressAndInfo.objects.filter(user=request.user).get()
if(order_items.count() > 0):
    total = 0
    for item in OrderItem.objects.filter(owner=request.user).filter(is_ordered=False).all():
        if item.product.discounted_price > 0:
            total = total + item.product.discounted_price
        else:
            total = total + item.product.price
    order = Order.objects.create(
        owner = Profile.objects.get(user= request.user.id),
        shipping = address,
        price = total
    )
    new = Order.objects.get(items = None)
    print(new.ref_code)
    new.items.add(OrderItem.objects.get(owner=request.user, is_ordered=False))
    for item in order_items:
        item.is_ordered = True
        item.save()
    return redirect('dash')
else:
    messages.success(request, 'No item in Cart')
    return redirect('index')

现在的问题是,当我尝试从用户添加第二个订单时,它会将第二个订单中的订单项添加到所有现有订单中。结果是所有订单都有相同的订单项目。每当我尝试添加新订单时,新订单中的订单商品都会添加到所有现有订单中。

【问题讨论】:

    标签: django django-models django-views


    【解决方案1】:

    我用一些 cmets 对您的代码做了一些小改动,希望对您有所帮助! :)

    def checkout(request):
        order_items = OrderItem.objects.filter(owner=request.user, is_ordered=False).all()
    
        address = AddressAndInfo.objects.filter(user=request.user).get()
        if(order_items.count() > 0):
            total = 0
            # Look, you can reuse order_items here instead of making another query to the database :)
            for item in order_items:
                if item.product.discounted_price > 0:
                    total = total + item.product.discounted_price
                else:
                    total = total + item.product.price
    
            order = Order.objects.create(
                owner = Profile.objects.get(user= request.user.id),
                shipping = address,
                price = total
            )
            # I think you were making a request to the database to get the Order that has no items, 
            # are you sure it will be always be just one order?
            # Anyway that wouldn't be necessary if you already have the instance of the recently created order in the 'order' variable above
            # new = Order.objects.get(items = None)
            print(order.ref_code)
    
            # Just one item is being added to the recently created Order here, 
            # and another query is being made to the database to get just one OrderItem with (owner=request.user, is_ordered=False)
            # maybe the is_ordered value of the item would be modified after this but I think it's safer to add the item after changing that value
            # order.items.add(OrderItem.objects.get(owner=request.user, is_ordered=False))
            for item in order_items:
                item.is_ordered = True            
                item.save()
                # Instead each item should be added inside this loop after each one is modified and saved
                order.items.add(item)
            return redirect('dash')
        else:
            messages.success(request, 'No item in Cart')
            return redirect('index')
    

    希望这能有所帮助!无论如何,我不确定您是否应该在Order 类中使用items = models.ManyToManyField(OrderItem),因为您是说同一个ItemOrder 也可能属于许多Orders?而且我认为您想要做的是OrderItem 只能属于一个订单,对吗?也许您可以像这样在OrderItem 中添加一个“订单”ForeignKey 列:

    class OrderItem(models.Model):
        product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
        order = models.ForeignKey(Order, on_delete=models.SET_NULL, null=True, related_name='items')
        is_ordered = models.BooleanField(default=False)
        owner = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
        date_added = models.DateTimeField(auto_now=True)
        date_ordered = models.DateTimeField(null = True)    
    
        def __str__(self):
            return self.product.name
    
    
    class Order(models.Model):
        ref_code = models.UUIDField(default=uuid.uuid4, editable=False)
        owner = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True)
        is_ordered = models.BooleanField(default=True)
        date_ordered = models.DateTimeField(auto_now=True)
        shipping = models.ForeignKey(AddressAndInfo, on_delete=models.SET_NULL, null=True)
        is_shipped = models.BooleanField(default=False)
        price = models.FloatField(default=0.0)
    

    如果您这样做,您所要做的就是在更新它们的最后一个循环中将订单分配给您的 OrderItems

    for item in order_items:
        item.is_ordered = True 
        item.order = order          
        item.save()
    

    现在您的 OrderItems 在数据库级别只有一个 Order :)

    【讨论】:

    • 但我试图仅将购物车中的订单项目设置为订单模型。我的代码用于将购物车中的商品添加到所有现有记录中。
    • 另一方面,此代码仅添加一个带有订单项目的订单。我的应用要求用户可以在一个订单中订购多件商品
    • 您是否尝试过更改并且第一段代码一直出错?您使用我添加的第二段代码获得具有多个 OrderItems 的订单,也许似乎只添加一个带有订单项目的订单,但这就是您在模型之间获得一对多关系的方式。
    • 您使用我添加的第二段代码获得具有多个 OrderItems 的订单,但这是您在 Django 中获得模型之间的一对多关系的方式,请查看这些链接,它们可以帮助您更好地理解我想要做什么:linklink
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2014-01-22
    • 2011-11-06
    • 1970-01-01
    • 2016-03-08
    • 2021-12-27
    • 1970-01-01
    相关资源
    最近更新 更多