【问题标题】:AttributeError: 'QuerySet' object has no attribute 'product' ERRORAttributeError: 'QuerySet' 对象没有属性 'product' 错误
【发布时间】:2021-05-08 04:16:36
【问题描述】:

您好,我正在建立一个具有购物车和结帐功能的网上商店。现在我正在尝试将产品及其数量添加到电子邮件表单中,显然我想将其发送到电子邮件中,但我不知道如何获取 item.name 或 item.quantity 而不会出现如图所示的错误下面。

我有以下型号:

class Customer(models.Model):
    user = models.OneToOneField(User, null=True, blank=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=200, null=True)
    email = models.CharField(max_length=200)

    def __str__(self):
        return self.name


class Product(models.Model):
    name = models.CharField(max_length=200, null=True)
    price = models.FloatField()
    digital = models.BooleanField(default=False, null=True, blank=False)  # Nicht nötig
    image = models.ImageField(null=True, blank=True)

    def __str__(self):
        return self.name

    @property
    def imageURL(self):
        try:
            url = self.image.url
        except:
            url = ''
        return url


class Order(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, blank=True, null=True)
    date_ordered = models.DateTimeField(auto_now_add=True)
    complete = models.BooleanField(default=False, null=True, blank=False)
    transaction_id = models.CharField(max_length=200, null=True)

    def __str__(self):
        return str(self.id)

    @property
    def get_cart_total(self):
        orderitems = self.orderitem_set.all()
        total = sum([item.get_total for item in orderitems])
        return total

    @property
    def get_cart_items(self):
        orderitems = self.orderitem_set.all()
        total = sum([item.quantity for item in orderitems])
        return total



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)
    quantity = models.IntegerField(default=0, null=True, blank=True)
    date_added = models.DateTimeField(auto_now_add=True)

    @property
    def get_total(self):
        total = self.product.price * self.quantity
        return total

所以我试图从查询集中获取产品名称和数量。但我收到标题中描述的错误

AttributeError: 'QuerySet' 对象没有属性 'product'。

我正在尝试将客户选择的产品名称和数量附加到消息变量中,该变量将通过 sendmail() 发送到电子邮件。

这是我的看法:

@login_required(login_url='login')
def checkout(request):
    if request.method == "POST":
        message_name = request.POST['message-name']
        message_email = request.POST['message-email']
        message = request.POST['message']
        message_to_send = str(message)
        # send an email
        send_mail(
             'message from ' + message_name,  # subject
             message_to_send,  # message
             message_email,  # from email
             ['jeampo@outlook.de'],  # To Email
        )
    if request.user.is_authenticated:
        customer = request.user.customer
        order, created = Order.objects.get_or_create(customer=customer, complete=False)
        items = order.orderitem_set.all()
        cartItems = order.get_cart_items
        print(items.product.name)
        print(items.quantity)

    context = {'items': items, 'order': order, 'cartItems': cartItems}
    return render(request, 'store/checkout.html', context)

感谢您的帮助。

【问题讨论】:

  • 在我看来,您正在获取所有项目,然后尝试获取产品的单一名称,您将不得不遍历所有项目。使用for item in items然后你可以调用item.product.name
  • @Shyrtle 谢谢,我试试我可以在views.py文件中写for循环对吗?
  • 是的,就在视图中。仔细检查它是否有效,我可以更详细地回答我的答案。
  • @Shyrtle 谢谢它的工作,但现在我必须将它保存在变量或字典或其他东西中,以便我可以通过电子邮件发送消息和项目。知道我该怎么做吗?
  • 您可以在 django 模板中执行 for 循环。 {% for item in items %}

标签: python django django-models django-views model


【解决方案1】:

您在 print 语句中调用 items.product.name,但 items 是一组对象,而不仅仅是单个对象。

您可以通过在 views.py 中使用以下代码代替 print(items.product.name) 来解决此问题

for item in items:
    print(item.product.name)

您也可以使用{% for %} 代码直接在模板中引用它。

例子:

在你的 template.html 中

{% for item in items %}
    <h1>{{item.product.name}}</h1>
{% endfor %}

【讨论】:

  • 感谢您的回答,但我不想在模板中显示它,我想将 for 循环的结果附加到变量或字典/元组中。我该怎么做?
  • 你会在你的views.py中这样做。在上面的 for 循环示例中,您可以将 print 语句替换为您想要执行的操作。
  • 好的谢谢我终于明白了^^"。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-19
  • 2016-11-20
  • 2019-07-10
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多