django - 由于 FOREIGN KEY 约束失败(IntegrityError),Django 反对创建失败
问题描述
我的网站有一个评论部分,用户可以在其中对产品发表评论。产品页面上的评论将存储在名为“ProductReview”的模型中。这是模型的代码:
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”,我使用 # 用 python 注释表示:
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”的相关部分
{% 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 页面中填写表单并尝试提交时,我收到以下错误:
FOREIGN KEY constraint failed
IntegrityError at /smartwatch/apple-watch/
谁能告诉我的代码到底有什么问题?
解决方案
很确定这一切都来自您的模型,尤其是这一行:
created_by = models.OneToOneField(User, on_delete=models.CASCADE)
您正在使用OneToOneField
. 这意味着单个用户将能够在您的整个应用程序中留下单个评论。您收到完整性错误可能是因为您选择的此用户已经对不同的产品进行了评论。
如果这不是您想要的,请使用 normalForeignKey
代替。
我认为您的意图是确保单个用户对每个产品只能留下一条评论。在这种情况下,您应该尝试在和字段之间设置UniqueConstraintproduct
created_by
推荐阅读
- java - 尝试使用 TestNG 7.3.0 版在 TestNG xml 文件中导入文档实体时出现 java.lang.ClassCastException
- python - 动态命名密钥 Mongoengine
- javascript - 如何在不使用 javascript 中的 new 关键字的情况下创建对象
- azure - Azure CORS 变量允许的来源
- ios - 如何在使用 RealityKit、ARKit 和 SwiftUI 时触发函数来保存和加载世界地图数据?
- angular - 一个组件重定向,而另一个组件上有 CanDeactivate 防护
- azure - 如何使用参数文件在 Azure Synapse Analytics 中将多个文件从 BLOB 导出为 Data Lake Parquet 格式?
- jmeter - Jmeter-JDBC 请求等到有结果
- api - 如何增加strapi API响应中的关系深度?
- java - 如何使用 azure-kusto-java 库在 java 中按列名获取单元格的值