【问题标题】:Django Deleting just one object from OneToOneField and retrieve itDjango 从 OneToOneField 中仅删除一个对象并检索它
【发布时间】:2016-05-18 16:10:56
【问题描述】:

我正在使用 Django 构建一个简单的网站,其中用户有一个购物车。他们可以将商品添加到购物车,然后可以购买(将购买的商品添加到另一个模型)。好吧,我是 Django 的新手,对此我有一个问题。购买产品后,我删除购物车对象并创建另一个对象购物车新空。我第一次购买产品一切都很好,但第二次我尝试支付物品。我总是得到空的 Cart 对象,但如果我检查数据库,我可以看到那里有合适的产品......

我将把我的 django 模型留在这里:

from __future__ import unicode_literals

from django.db import models
from django.contrib.auth.models import User

class Cart(models.Model):
    user = models.ForeignKey(User, null=True)
    items = models.ManyToManyField(Item, null=True)
    money = models.FloatField(default=0)
    def __str__(self):
        aux = ""
        for item in self.items.all():
            aux += "\n"+"["+item.name+"]" + str(item.price)+ " " + item.type + " " + str(item.description)+"\n"
        aux += "\n\nTotal Price: "+str(self.money)
        return aux

class Client(models.Model):
    user = models.OneToOneField(User)
    cart = models.OneToOneField(Cart, null=True, on_delete=models.SET_NULL)
    money = models.FloatField(default=0)
    def __str__(self):
        return "["+str(self.user)+"]"+str(self.money)

还有我的支付、购买和添加功能:

@login_required
def addCart(request):
    selectedItems =[]
    for key in request.POST:
         if key.startswith("checkbox"):
             identificador = int(request.POST[key])
             item = Item.objects.get(id=identificador)
             client = Client.objects.get(user=request.user.id)
             if client.cart == None:
                 user = User.objects.get(username=request.user.username)
                 cart = Cart.objects.create(user=user)
                 client.cart = cart
                 client.cart.items.add(item)
                 client.cart.money += item.price
                 client.cart.save()
             else:
                 client.cart.items.add(item)
                 client.cart.money += item.price
                 client.cart.save()
    return HttpResponseRedirect(request.META["HTTP_REFERER"])

@login_required
def buy(request):
    client = Client.objects.get(user=request.user.id)
    if client.cart != None:
        products = client.cart.items
        total = client.cart.money
    else:
        products = client.cart
        total = 0
    context = {
        'cart':products,
        'money':total
    }
    return render(request, 'mediacloud/buy.html', context)

def pay(request):
    client = Client.objects.get(user=request.user.id)
    products = client.cart.items.all()
    result = False
    if client.money >= client.cart.money:
        client.money -= client.cart.money
        client.save()
        client.cart.money = 0.0
        client.cart.save()
        for product in products:
            Purchases.objects.create(item=product, user=str(request.user))
            result = True
        user = User.objects.get(username=request.user.username)
        Cart.objects.filter(user=user).delete()
        cart = Cart.objects.create(user=user)
        client.cart = cart
        client.cart.save()
    context = {
        'result':result
    }
    return render(request, 'mediacloud/result.html', context)

我不明白为什么我没有从客户的购物车中检索任何商品...用户第一次向购物车添加东西时一切正常,但当我删除购物车对象并创建一个用户的新购物车对象也许我的模型走错路了...如果有人能指出我正确的方向,我将不胜感激

【问题讨论】:

    标签: python django models one-to-one


    【解决方案1】:

    因为您实际上是在尝试从购物车中清除商品,而不是删除购物车对象并重新创建它。尝试将 ManyToManyField 清除到 Cart 对象上的项目:

    Cart.objects.filter(user=user)[0].items.clear()
    

    【讨论】:

    • 我之前有那个代码,但是当我删除客户的购物车时,客户也被删除了......
    • 尝试将购物车指向客户。通过从客户端对象中取出 onetoone 并将其定义在购物车对象上。
    • 嗯,这是大学的练习(我不是要一个完整的解决方案,只是为什么我在删除购物车后无法访问购物车的物品以了解这种关系),我问我老师关于我是否可以按照您告诉我将客户保存到项目中的方式建立关系,但他告诉我应该为每个客户只保存一个购物车到客户模型类中。为此,我实现了之前展示的代码
    • 我可以看看你的删除功能吗?
    • 是的,我将购物车删除到支付功能中。你可以在上面的代码中看到它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 2018-02-23
    相关资源
    最近更新 更多