【问题标题】:Cannot assign queryset, must be an instance无法分配查询集,必须是实例
【发布时间】:2019-08-07 05:26:23
【问题描述】:

我收到此值错误:

/shop/items/buy/now/处的ValueError 无法分配“QuerySet 产品:mcloth2,产品:手表,产品:手表”:
“Buyer.product”必须是“产品”实例。
请求方法:POST 请求网址:http://127.0.0.1:8004/shop/items/buy/now/ Django 版本:2.1.5 异常类型:ValueError 异常值:
无法分配“, , ]>”:“Buyer.product”必须是“Product”实例。

buyer.product = 产品

views.py

    def items_buy_now(request):
    if not request.user.is_authenticated:
        messages.info(request, 'You have to logged in first.')
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
    sess = request.session.get("data", {"items": []})
    product = Product.objects.filter(active=True, slug__in=sess["items"])
    if request.method == "POST":
        form = BuyerDeliveryForm(request.POST)
        if form.is_valid():
            buyer = form.save(commit=False)
            buyer.product = product
            buyer.save()
            return redirect('shop:payment')
    else:
        form = BuyerDeliveryForm()
    return render(request, 'shop/delivery_form.html', {'form': form})



def cart(request,slug):
    product = Product.objects.get(slug=slug)
    initial = {"items":[],"price":0.0,"count":0}
    session = request.session.get('data',initial)
    if slug in session['items']:
        messages.error(request,'Already added.')
    else:
        session["items"].append(slug)
        session["price"] += float(product.price)
        if product.shipping_fee:
            session['price'] += float(product.shipping_fee)
        session["count"] += 1
        request.session["data"] = session
        messages.success(request,'Added to Cart.')
    return redirect('shop:detail',slug)


def mycart(request):
    sess = request.session.get("data", {"items": []})
    products = Product.objects.filter(active=True, slug__in=sess["items"])
    if not products:
        return render(request,'shop/empty_cart.html')
    context = {"products": products,
               "categories": categories}
    return render(request,'shop/cart_item.html',context)

models.py

class Buyer(models.Model):
full_name = models.CharField(max_length=250)
phone = models.CharField(max_length=20)
city = models.CharField(max_length=250,choices=city_choices)
address = models.CharField(max_length=250,default="123Area , House#123 , Street#123")
product = models.ForeignKey(Product,on_delete=CASCADE)

def __str__(self):
    return self.full_name




class Product(models.Model):
name = models.CharField(max_length=250)
image = models.ImageField(upload_to='products')
seller = models.ForeignKey(User,on_delete=CASCADE)
slug = AutoSlugField(populate_from='name')
category = models.ForeignKey(Category,on_delete=CASCADE)
description = models.TextField(blank=True,default="Description Field")
brand = models.CharField(max_length=250)
quantity = models.PositiveIntegerField(default=1)
price = models.DecimalField(max_digits=10,default=0.0,decimal_places=2)
shipping_fee = models.DecimalField(max_digits=10,default=0.0,decimal_places=2)
featured = models.BooleanField(default=False)
active = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)

def __str__(self):
    return self.name

forms.py

    class SellProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['name','image','category', 'description', 'brand', 'quantity', 'price', 'shipping_fee']


class BuyerDeliveryForm(forms.ModelForm):
    class Meta:
        model = Buyer
        fields = ['full_name','phone','city','address']

urls.py`

  path('items/buy/now/',views.items_buy_now,name='items_buy_now'),
  path('mycart/', views.mycart, name='mycart'),
  path('<slug>/cart/', views.cart, name='cart'),

`

模板

 {% extends "shop/base.html" %}
{% load bootstrap4 %}
<title>{% block title %}Cart Items{% endblock  %}</title>

{% block content %}
<center>
  {% bootstrap_messages %}
        {% for item in products %}
       <div class="col-lg-4 col-md-4 mb-4">
              <div class="card h-50">
                <div class="card-body">
                    <a href="{% url 'shop:detail' item.slug %}"><img src="/media/{{ item.image }}" width=200 height="100" alt=""></a>
                    <div class="card-body">
                      <h4 class="card-title">
                        <a href="{% url 'shop:detail' item.slug %}">{{ item.name|title }}</a>
                      </h4>
                      <h5>Rs. {{ item.price|floatformat:"2" }}</h5>
                        <h5>Shipping fee:{{item.shipping_fee}}</h5>
                    </div>
                    </div>
                  </div>
                </div>
     {% endfor %}
          <b>Items({{request.session.data.items|length}})</b><br>
              {% for item in products %}
             {{item.name}}: Rs.{{item.price}}
              <br>
              {% endfor %}
          <br>
              <h5>Shipping Fee:</h5>
             {% for item in products %}
              {{item.name}}: Rs{{item.shipping_fee }} <br>
              {% endfor %}
              <br>
              <h5>Total Price:<b style="color:blue;">Rs
              {{request.session.data.price}}</b></h5>
               <a class="btn btn-success" href="{% url 'shop:items_buy_now' %}">PROCEED TO CHECKOUT</a>



              <br><br>

      </div>



    </center>
{% endblock %}

【问题讨论】:

    标签: python django


    【解决方案1】:

    基本上 Django 的 ORM 需要一个对象,而不仅仅是一个键或查询集。

    注意:必须先保存对象,然后才能将其分配给外键关系

    试试这个

    在views.py中

    def items_buy_now(request):
        if not request.user.is_authenticated:
            messages.info(request, 'You have to logged in first.')
            return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
        sess = request.session.get("data", {"items": []})
        product = Product.objects.filter(active=True, slug__in=sess["items"])
        if request.method == "POST":
            form = BuyerDeliveryForm(request.POST)
            if form.is_valid():
                buyer = form.save(commit=False)
                buyer.product = Product.objects.get(active=True, slug=sess["items"])
                buyer.save()
                return redirect('shop:payment')
        else:
            form = BuyerDeliveryForm()
        return render(request, 'shop/delivery_form.html', {'form': form})
    

    更多详情请参考this

    【讨论】:

      【解决方案2】:
      1. 过滤器返回多个对象,您必须选择一个。

        product = Product.objects.filter(active=True, slug__in=sess["items"])
        if request.method == "POST":
           buyer.product = product.first()
        
      2. 在这种情况下你可以使用get方法。

        product = Product.objects.get(active=True, slug__in=sess["items"])
        

      了解更多Difference between Django's filter() and get() methods

      【讨论】:

      • 异常类型:MultipleObjectsReturned 异常值:get() 返回了多个产品——它返回了 2 个!我在使用 get 方法时遇到了这个异常
      • @Peter,在这种情况下,请使用过滤器。 get 用于唯一的对象。
      猜你喜欢
      • 2021-05-02
      • 2021-04-08
      • 2011-02-22
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      相关资源
      最近更新 更多