首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于外键约束失败而导致创建Django对象失败(IntegrityError )

由于外键约束失败而导致创建Django对象失败(IntegrityError )
EN

Stack Overflow用户
提问于 2021-04-28 12:34:20
回答 1查看 29关注 0票数 1

我的网站有一个评论部分,用户可以在产品上留下评论。产品页面上的注释将存储在一个名为“ProductReview”的模型中。下面是模型的代码:

代码语言:javascript
复制
    class ProductReview(models.Model):
        product = models.ForeignKey(Product, related_name='reviews', on_delete=models.CASCADE)
        name = models.CharField(blank=True,max_length=20)
        stars = models.IntegerField()
        content = models.TextField(blank=True)
        date_added = models.DateTimeField(auto_now_add=True)
        created_by = models.OneToOneField(User, on_delete=models.CASCADE)

现在,与模型关联的视图如下所示--注意:整个视图与错误无关。与保存注释相关的部分是第二个'request.POST‘,我使用#表示了这个注释:

代码语言:javascript
复制
def product(request, category_slug, product_slug):
    cart = Cart(request)
    product = get_object_or_404(Product, category__slug=category_slug, slug=product_slug)

    if request.method == 'POST':
        form = AddToCartForm(request.POST)

        if form.is_valid():
            quantity = form.cleaned_data['quantity']
            cart.add(product_id=product.id, quantity=quantity, update_quantity=False)
            messages.success(request, 'The product was added to the cart')
            return redirect('product', category_slug=category_slug, product_slug=product_slug)

    similar_products = list(product.category.products.exclude(id=product.id))

    # this part is for saving of the user comments to productreview model
    if request.method == 'POST':
        stars = request.POST.get('stars', 3)
        content = request.POST.get('content', '')
        name = request.POST.get('name', '')
        created_by = request.user

        review = ProductReview.objects.create(product=product, name=name, stars=stars, content=content, created_by=created_by)
        return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
    # this marks the end of the code relevant to saving the user comment 

    if len(similar_products) >= 4:
        similar_products = random.sample(similar_products, 4)

    user_type = 0
    if request.user.is_authenticated:
        user_type = UserType.objects.filter(created_by=request.user.id).values_list('user_type', flat=True)
        user_type = int(user_type[0])
    return render(request, 'product.html', {'product': product, 'similar_products': similar_products, 'user_type': user_type})

最后,在视图中引用的模板'product.html‘的相关部分

代码语言:javascript
复制
{% if request.user.is_authenticated %}
        {% if user_type == 2 %}
            <div class="notification space-below">
                <form method="post" action=".">
                    {% csrf_token %}


                     <div class="field">
                        <label>Name</label>
                        <div class="control">
                            <input class="text" name="name" value="{{ request.user }}" readonly>
                        </div>
                    </div>


                    <div class="field">
                        <label>Stars</label>
                        <div class="control">
                             <div class="select">
                                 <select name="stars">
                                     <option value="1">1</option>
                                     <option value="2">2</option>
                                     <option value="3" selected>3</option>
                                     <option value="4">4</option>
                                     <option value="5">5</option>

                                 </select>
                             </div>
                        </div>
                    </div>

                    <div class="field">
                        <label>Content</label>
                        <div class="control">
                            <textarea class="textarea" name="content"></textarea>
                        </div>
                    </div>

                    <div class="field">
                        <div class="control">
                            <button class="button is-success">Submit</button>
                        </div>
                    </div>

                </form>
            </div>

            {% else %}
                <div>sign in with a buyer account to leave review</div>

            {% endif %}
    {% endif %}

现在,当我试图在product.html页面中填写表单并提交它时,我会得到以下错误:

代码语言:javascript
复制
FOREIGN KEY constraint failed
IntegrityError at /smartwatch/apple-watch/

有人能说出我的代码到底有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-28 12:46:41

非常肯定,所有这些都适用于您的模型,特别是这一行:

代码语言:javascript
复制
    created_by = models.OneToOneField(User, on_delete=models.CASCADE)

您正在使用OneToOneField。这意味着单个用户将能够在整个应用程序中留下一个检查。您正在获得完整性错误,可能是因为您选择的这个用户已经对不同的产品进行了审查。

如果这不是您想要的,那么使用普通的ForeignKey代替。

我认为您的目的是确保单个用户只能在每个产品上留下一个评论。在这种情况下,您应该尝试在productcreated_by字段之间设置created_by

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67300343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档