I'm trying to prevent a certain Insert if a product has base_image=True but allow as many insertions as we want when base_image=False.
I've implemented it with django.db.models.UniqueConstraint, EVERYTHING WORKS FINE but in django admin panel instead of getting a red alert in adding view, I'm getting IntegrityError.
here is my model (media.py):
from django.db import models
from apiv1.models.products import Product
class Media(models.Model):
""" Media table, contains images file names """
product = models.ForeignKey(Product, related_name='media', on_delete=models.CASCADE, blank=False)
file_name = models.CharField(max_length=191, blank=False, unique=True)
base_image = models.BooleanField(blank=False)
class Meta:
constraints = [
models.UniqueConstraint(
fields=[
'product',
],
condition=models.Q(base_image=True),
name='unique_base_image'
),
]
def __str__(self):
return self.file_name
and this is the error:
IntegrityError at /admin/apiv1/media/add/
UNIQUE constraint failed: apiv1_media.product_id
Request Method: POST
Request URL: http://127.0.0.1:8000/admin/apiv1/media/add/
Django Version: 3.1.4
Exception Type: IntegrityError
Exception Value:
UNIQUE constraint failed: apiv1_media.product_id
Exception Location: /Users/sal/devel/artiashco_tipnety_cbir/env/lib/python3.7/site-packages/django/db/backends/sqlite3/base.py, line 413, in execute
Python Executable: /Users/sal/devel/artiashco_tipnety_cbir/env/bin/python
Python Version: 3.7.3
Python Path:
['/Users/sal/devel/artiashco_tipnety_cbir',
'/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python37.zip',
'/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7',
'/Library/Developer/CommandLineTools/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/lib-dynload',
'/Users/sal/devel/artiashco_tipnety_cbir/env/lib/python3.7/site-packages']
Server time: Wed, 30 Dec 2020 12:58:16 +0000
Expectation: red bootstrap alert in django admin panel