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
Вернуться на верх