【问题标题】:ValueError Cannot assign "<QuerySet [<Product:name>]ValueError 无法分配“<QuerySet [<Product:name>]
【发布时间】:2021-08-18 01:25:24
【问题描述】:

我是一名学习 Django 的学生。我想实现以便在订购产品时收到订单(加入模型)数据库中的产品代码,但这很困难,因为我不断收到类似标题的错误。我想我会死,因为它没有解决太久。 当我使用 product.object.all() 时,所有查询集都被加载,即使我使用过滤器,也会发生错误。我怎么解决这个问题?如果您能回复,那就太荣幸了。

错误信息

ValueError at /join/element_detail/ 无法分配“、、、, , , , ]>": "Join.product_code" 必须是 “产品”实例。

join / views.py

join.product_code = product

这部分似乎是问题所在。

models.py

class Product(models.Model):
    product_code = models.AutoField(primary_key=True)
    username = models.ForeignKey(Member, on_delete=models.CASCADE, db_column='username')
    category_code = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, related_name='products')
    name = models.CharField(max_length=200, db_index=True)
    slug = models.SlugField(max_length=200, db_index=True, unique=False, allow_unicode=True)
    image = models.ImageField(upload_to='products/%Y/%m/%d', blank=True)
    benefit = models.TextField()
    detail = models.TextField()
    target_price = models.IntegerField()
    start_date = models.DateField()
    due_date = models.DateField()

    class Meta:
        ordering = ['product_code']
        index_together = [['product_code', 'slug']]

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('zeronine:product_detail', args=[self.product_code, self.slug])


class Join(models.Model):
    join_code = models.AutoField(primary_key=True)
    username = models.ForeignKey(Member, on_delete=models.CASCADE, db_column='username')
    product_code = models.ForeignKey(Product, on_delete=models.CASCADE, db_column='product_code')
    part_date = models.DateTimeField(auto_now_add=True)

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

    class Meta:
        ordering = ['join_code']

我的猜测是这部分有问题。(join/views.py) 我认为在收到产品的过程中出了点问题,但我不知道是怎么回事。

join/views.py

def element_detail(request):
    designated_object = Designated.objects.all()
    element_object = Element.objects.all()
    value_object = Value.objects.all()
    product = Product.objects.all()

    if request.method == "POST":
            join = Join()
            join.product_code = product
            join.username = request.user
            join.part_date = timezone.now()
            join.save()


            return render(request, 'zeronine/list.html')


    return render(request, 'zeronine/detail.html', {'designated_object': designated_object,
                                                    'element_object': element_object,
                                                    'value_object': value_object})

zeronine/views.py

def product_in_category(request, category_slug=None):
    current_category = None
    categories = Category.objects.all()
    products = Product.objects.all()

    if category_slug:
        current_category = get_object_or_404(Category, slug=category_slug)
        products = products.filter(category_code=current_category)

    return render(request, 'zeronine/list.html', {'current_category': current_category,
                                                  'categories':categories,
                                                  'products':products})

def product_detail(request, id, product_slug=None):
    current_category = None
    categories = Category.objects.all()
    products = Product.objects.all()
    product = get_object_or_404(Product, product_code=id, slug=product_slug)
    designated_object = Designated.objects.filter(rep_price='True')
    element_object = Element.objects.all()
    value_object = Value.objects.all()

    return render(request, 'zeronine/detail.html', {'product':product,
                                                    'products':products,
                                                    'current_category': current_category,
                                                    'categories':categories,
                                                    'designated_object': designated_object,
                                                    'element_object':element_object,
                                                    'value_object':value_object})

zeronine/detail.html

        <form method="POST" style="margin-left: 110px;" action="{% url 'zeronine:element_detail' %}">
                    <div class="form-group row">
                        <label for="value_code" class="col-sm-2 col-form-label"><b>옵션</b></label>
                        <div class="col-sm-5">
                            <select type="text" class="form-control" name="value_code" id="value_code">
                                {% for value in value_object %}
                                {%if value.product_code == product %}
                                    <option value="{{value.value_code}}">{{value.name}}</option>
                                    {% endif %}
                                {% endfor %}
                            </select>
                        </div>
                    </div>

                {% csrf_token %}
                 {% if not user.is_authenticated %}
                <a onclick="alert('로그인 후 참여가 가능합니다.');" style="cursor:pointer;">
                    <button type="submit" style="background:black; border-color:black;" class="btn btn-primary">&nbsp;참여하기</button></a>

                <a onclick="alert('로그인 후 찜하기가 가능합니다.');" style="cursor:pointer;">
                    <button type="submit" style="background:white; color:black; border-color:black;" class="btn btn-primary">찜하기</button></a>

                  {% else %}
                <a onclick="alert('{{ product.name }} 공동구매 참여가 완료되었습니다.');" style="cursor:pointer;">
                    <button type="submit" action="{% url 'zeronine:element_detail' %}" style="background:black; border-color:black;" class="btn btn-primary">&nbsp;참여하기</button></a>
                <a onclick="alert('{{ product.name }} 상품을 찜했습니다.');" style="cursor:pointer;">
                    <button type="submit" style="background:white; color:black; border-color:black;" class="btn btn-primary">찜하기</button></a>
                  {% endif %}
            </form>

【问题讨论】:

  • 你能显示你收到的所有错误信息吗?
  • @Martins 在文本中添加了错误消息和有问题的部分!
  • 我认为您正在尝试将查询集“产品”添加到连接模型字段“product_code”,这是产品模型的 ForegnKey。尝试做这样的事情` product = Product.objects.first() if request.method == "POST": join = Join() join.product_code = product join.username = request.user join.part_date = timezone.now( ) join.save()`
  • 如果您尝试将单个对象添加到 Join(),请使用 get。顾名思义,“.filter() 和 .all()”将返回 qureyset 而不是对象实例。
  • @Martins 仅正确订购了一种产品。但我哭了,因为我很高兴数据被输入到数据库中。我应该怎么做才能订购所有产品?如果您能给我一个答案,我将不胜感激。

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


【解决方案1】:
    def element_detail(request):
        designated_object = Designated.objects.all()
        element_object = Element.objects.all()
        value_object = Value.objects.all()
        product = Product.objects.all()
    
        if request.method == "POST":
                product_id = request.POST.get('value_code') # new
                product = Product.objects.get(product_code=product_id) # new
# Or 
        #product_ids = request.POST.getlist('value_code')
        #products = Product.objects.filter(product_code__in=product_ids)
        #loop all products and save example;
        #for product in products:
        #   join = Join()
        #   join.product_code = product
        #   join.username = request.user
        #   join.part_date = timezone.now()
        #   join.save()
                join = Join()
                join.product_code = product
                join.username = request.user
                join.part_date = timezone.now()
                join.save()
    
    
                return render(request, 'zeronine/list.html')

编辑以包含模板中的多个值,我当然假设。

【讨论】:

    猜你喜欢
    • 2011-12-23
    • 2012-01-08
    • 2014-04-09
    • 2018-06-03
    • 1970-01-01
    • 2019-11-14
    • 2020-04-04
    • 1970-01-01
    相关资源
    最近更新 更多