Django.db.utils.IntegrityError: UNIQUE constraint failed: store_wishlist.user_id
Я работаю над сайтом электронной коммерции. Я хотел реализовать функцию списка желаний на своем сайте. Она работает, если пользователь добавляет товар в список в первый раз. Во второй раз выдает ошибку. В чем проблема? Кто-нибудь может мне помочь? views.py
def addWishlistView(request):
data = json.loads(request.body)
productId = data['productId']
action = data['action']
print('Action:', action)
print('Product:', productId)
user = request.user
product = Product.objects.get(id=productId)
if (Wishlist.objects.filter(user=user) and Wishlist.objects.filter(product=product)).exists():
print("Item is exists")
else:
Wishlist.objects.create(user=user,product=product)
return JsonResponse('Item was added', safe=False)
models.py
class Wishlist(models.Model):
product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True, verbose_name="Название товара")
user = models.OneToOneField(User, on_delete=models.CASCADE,null=True, blank=True)
script js
for (i = 0; i < wishlist.length; i++) {
wishlist[i].addEventListener('click', function(){
var productId = this.dataset.product
var action = this.dataset.action
if (user == 'AnonymousUser'){
Console.log("Not logged in");
}else{
addToWishlist(productId, action)
}
})
}
function addToWishlist(productId, action){
console.log('User is authenticated, sending data...')
var url = '/add_wishlist/'
fetch(url, {
method:'POST',
headers:{
'Content-Type':'application/json',
'X-CSRFToken':csrftoken,
},
body:JSON.stringify({'productId':productId, 'action':action})
})
.then((data) => {
location.reload()
})
}
Измените Wishlist.user на models.ForeignKey, чтобы вы могли добавлять несколько продуктов для каждого пользователя, вы можете добавить уникальное ограничение к модели, чтобы позволить пользователю добавлять продукт только один раз, используя Meta.unique_together
class Wishlist(models.Model):
product = models.ForeignKey(Product, on_delete=models.SET_NULL, verbose_name="Название товара")
user = models.ForeignKey(User, on_delete=models.CASCADE)
class Meta:
unique_together = (
('user', 'product'),
)
В вашем представлении вам не нужен блок if, вы можете использовать get_or_create для создания новой записи, только если она еще не существует
Wishlist.objects.get_or_create(user=user, product=product)
Для удаления товара из списка желаний пользователя, если он существует или нет, вы можете использовать метод delete() на фильтрованном наборе запросов
deleted = Wishlist.objects.filter(user=user, product=product).delete()
if deleted == 0:
# Can do something when nothing was deleted if you like