【问题标题】:Django User-Specific objects via ForeignKey通过 ForeignKey 的 Django 用户特定对象
【发布时间】:2020-08-09 19:05:31
【问题描述】:

我正在尝试实现一个用户特定的购物车,如下所示:

class Cart (models.Model):  
    items = []
    totalprice = 0
    user = models.ForeignKey(User, on_delete=models.CASCADE, 
           related_name="cart", null=True)

我有一个 HTML 模板,它将显示一个项目并允许当前用户将其添加到他们的购物车:

<ul>
<img src={{ item.pic.url }}>
<li>{{ item.name }}</li>
<li>{{ item.desc }}</li>
<li>${{ item.cost }}</li>
</ul>
<br>
<a href={% url 'gallery:add_to_cart' item.id %}>Add to Cart</a>

add_to_cart 函数是:

def add_to_cart (request, id):
    if request.user.is_authenticated:
        if not request.user.cart.all():
            c = Cart()
            c.save()
            request.user.cart.add(c)
        request.user.cart.all()[0].addItem(Item.objects.get(id=id))
    return HttpResponseRedirect('/gallery/')

对于第一个用户来说一切正常,但是一旦第一个用户注销并且另一个用户登录,他们的购物车似乎是交织在一起的。 Django 将为第二个用户创建一个购物车,但这个购物车不会初始化为空;它将与第一个用户的购物车具有相同的内容。

作为第二个用户将任何项目添加到购物车时,该项目将被添加到两个购物车中,并且它们的内容将相同。

Active "Cart" objects upon adding an Item as the second user

简而言之,在访问他们的购物车时,我无法区分各个用户。有什么我可以做的吗?我很感谢您的任何建议。

谢谢。

【问题讨论】:

    标签: python html django oop foreign-keys


    【解决方案1】:

    items 是一个可变 对象,它绑定到 Cart 类本身,不是到特定的购物车实例。当您将项目添加到 items 时,只要您的服务器对其进行处理,它就会一直保留在那里,或者直到您手动删除它们。

    您想要的是引用您的 Item 模型的ManyToManyField

    class Cart (models.Model):  
        user = models.ForeignKey(User, on_delete=models.CASCADE, 
               related_name="cart", null=True)
       
        items = models.ManyToManyField('myapp.Item')
    

    现在,在您看来,您的查询将如下所示:

    def add_to_cart (request, id):
        if request.user.is_authenticated:
            cart = Cart.objects.filter(user=request.user)
            cart.items.add(id)
        
        ...
    

    【讨论】:

      【解决方案2】:

      您的Cart 的字段是python 对象,而不是数据库项。所以它只是改变了python中的对象。你想要:

          items = models.ManyToManyField(Item)
          totalprice = models.IntegerField()
      

      这意味着itemstotalprice 现在与User 外键一起存储在数据库中。进行此更改后,请务必 makemigrationsmigrate 您的数据库。

      【讨论】:

        猜你喜欢
        • 2020-07-04
        • 2014-06-20
        • 1970-01-01
        • 1970-01-01
        • 2019-09-23
        • 2010-09-20
        • 2012-05-18
        • 2011-05-09
        • 2016-07-10
        相关资源
        最近更新 更多