【问题标题】:django.db.utils.IntegrityError: UNIQUE constraint failed: auctions_bids.item_iddjango.db.utils.IntegrityError:唯一约束失败:auctions_bids.item_id
【发布时间】:2021-03-02 05:55:18
【问题描述】:

我在建立拍卖网站时遇到了这个问题:

UNIQUE 限制失败:auctions_bids.item_id

models.py

from django.contrib.auth.models import AbstractUser
from django.db import models
from django.db.models.deletion import CASCADE
from django.db.models.fields import EmailField, NOT_PROVIDED


class User(AbstractUser):
    pass

class Listings(models.Model):
    title = models.CharField(max_length=64)
    description = models.TextField(max_length=250)
    price = models.FloatField()
    image_url = models.CharField(max_length=150)
    category = models.ForeignKey(Categories, on_delete=models.CASCADE)
    listed_by = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.title}" #{self.description} {self.price} {self.image_url} {self.category}"


class Bids(models.Model):
    item = models.OneToOneField(Listings, on_delete=models.CASCADE)
    bid = models.FloatField(blank=True)
    user_bid = models.ForeignKey(User, on_delete=models.CASCADE, blank=True)

    def __str__(self):
        return f"{self.item} {self.bid} {self.user_bid}"
    

views.py

def placebid(request, id_product):
    if request.method == "POST":
        item_list = Listings.objects.get(pk=id_product)
        bid = request.POST['bid']
        user = request.user
        Bids.objects.update_or_create(item=item_list, bid=bid, user_bid=user)
        return redirect(reverse("listings", args=(id,)))

当我尝试更新新出价时,出现上述错误,删除旧对象并创建新对象的唯一方法,如果对象存在,我想更新新出价,如果对象不存在则创建'使用update_or_create存在

我认为我在设置 Bids 模型的参数项值时出错了,但我不知道如何解决它们!给我任何建议,非常感谢!!!

【问题讨论】:

标签: python django django-models django-views


【解决方案1】:

您也在过滤biduser_bid。因此,这意味着它只会在itembiduserbid 相同的情况下更新。但很可能你想从item 相同的那一刻起更新,所以你应该使用.update_or_create(…) method [Django-doc]defaults=… 参数:

from django.shortcuts import redirect

def placebid(request, id_product):
    if request.method == 'POST':
        bid = request.POST['bid']
        user = request.user
        Bids.objects.update_or_create(
            item_id=id_product
            defaults={'bid': bid, 'user_bid': user}
        )
        return redirect('listings', id)

Django 将因此检查它是否可以找到item_idid_productBids 对象。如果可以,它将更新defaults 中指定的biduser_bid,否则它将创建具有这些默认值的Bids 对象。


注意:通常 Django 模型被赋予一个单数名称,所以Bid而不是Bids

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-05
    • 2016-04-11
    • 2019-12-31
    • 2022-01-21
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多