Python/Django: RelatedObjectDoesNotExist: 购物车没有用户。

3
我在我的数据库中有3个表,分别是UserFlowerCart。我正在为用户创建一个购物车体验,其中用户登录后可以获得一个购物车,可以向其添加物品,然后从购物车中订购物品。
我的Cart有一个ManyToManyField(Flower),而我的User有一个OneToOneField(Cart)。当用户将物品添加到购物车时,我需要为他们创建一个购物车,然后存储他们的用户ID和他们点击以添加到购物车的花卉ID(或名称)。
目前,我正在进行以下步骤...
1) 通过p1 = User.objects.filter(username = 'erik')从数据库中获取用户
2) 从列表中获取用户对象p1 = [0] 3) c1 = Cart(id = 1) 4) c1.user.add(p1) 我遇到了以下错误:RelatedObjectDoesNotExist: Cart has no user. 为什么这不起作用,我该如何让它做我需要它做的事情? 我的模型...
from __future__ import unicode_literals
from django.contrib.auth.models import User
from django.db import models

class Flower(models.Model):
    name = models.CharField(max_length=255)
    link = models.CharField(max_length=255)
    created_at = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.name
class Meta:
    db_table = 'Flower'

class Cart(models.Model): 
    userid = models.CharField(max_length=255)
    flowername = models.CharField(max_length=255) 
    user = models.OneToOneField(User)
    flower = models.ManyToManyField(Flower)

你的代码存在一些作用域错误。def __str__(self): 应该在 Flower() 的作用域内。class Meta: 也是如此。 - Dirty Penguin
@DirtyPenguin 辛苦了! - Erik Åsland
2个回答

5
我认为在这种情况下使用的正确架构如下:
class Cart(models.Model):
    user = models.OneToOneField(User, related_name='cart')        
    date_added = models.DateTimeField(auto_now_add=True, help_text="Date when cart is added.")
    date_modified = models.DateTimeField(auto_now=True, help_text="Date when cart is modified.")


class CartDetail(models.Model):
    cart = models.ForeignKey(Cart, related_name='cart_details')
    flower = models.ForeignKey(Flower)
    quantity = models.PositiveSmallIntegerField(help_text='Quantity to be purchased.')
    date_added = models.DateTimeField(auto_now_add=True,
                                      help_text="Date when this item is added.")
    date_modified = models.DateTimeField(auto_now=True, help_text="Date when this item is modified.")

因此,在这种情况下,你可以通过以下方式获取用户的购物车详细信息:

try:
    cart = request.user.cart
except Cart.DoesNotExist:
    cart = Cart.objects.create(user=request.user)
    cart_details = cart.cart_details.all().order_by('-date_added')

如果用户刚登录,则会为其创建一个新购物车。

您可以通过以下方式向用户的购物车添加商品:

# Assuming you have flower object and quantity=number of qty.
cart_item = CartDetail(flower=flower, cart=request.user.cart, quantity=quantity)

cart_item.save()

这种方法比你尝试的那种更加简洁。希望这能有所帮助。

请问你能解释一下 related_name='cart' 是什么意思吗? - Erik Åsland
您能解释一下 help_text= 吗? - Erik Åsland
如果您直接使用ModelForm或在管理界面中,help_text将显示为表单字段下的小文本。https://docs.djangoproject.com/en/1.9/ref/models/fields/#help-text - Aakash Rayate
related_name 用于反向关系。请参阅此链接,https://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.ForeignKey.related_name - Aakash Rayate

1
我认为在创建用户时或用户要购买物品时创建购物车更加有效,而不是在将花放入购物车时才创建它。
好的,只需使用信号,在购买行为发生时尝试使用pre_add或pre_save。

https://docs.djangoproject.com/en/1.9/ref/signals/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接