Django уникальное ограничение не работает
Я создаю модель книги, и в этой модели есть переменная isbn, у которой ограничение unique должно быть установлено на true, что должно остановить дублирование значений isbn в моей базе данных. однако при модульном тестировании этой модели тест test_isbn_must_be_unique() не выдает ошибку валидации, хотя я установил unique на true в модели книги.
Я ожидал, что тест пройдет, так как в списке ограничений для переменной isbn я установил значение unique равным true. однако тест не прошел.
`# models.py file
from django.core.validators import RegexValidator
from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
username = models.CharField(
max_length=30,
unique=True,
validators=[RegexValidator(
regex=r'^@\w{3,}$',
message='Username must consist of @ followed by at least three alphanumericals'
)]
)
first_name = models.CharField(max_length=50, blank=False)
last_name = models.CharField(max_length=50, blank=False)
email = models.EmailField(unique=True, blank=False)
bio = models.CharField(max_length=520, blank=True)
class Book(models.Model):
isbn = models.CharField(max_length=13, unique=True, null=False, blank=False)
book_title = models.TextField(blank=False, max_length=500)
book_author = models.CharField(blank=False, max_length=255)
year_of_publication = models.CharField(max_length=13, blank=False)
publishers = models.CharField(blank=False, max_length=255)
image_url_s = models.CharField(blank=False, max_length=255)
image_url_m = models.CharField(blank=False, max_length=255)
image_url_l = models.CharField(blank=False, max_length=255)`
`"Testing Book Model"
from django.test import TestCase
from django.core.exceptions import ValidationError
from clubs.models import Book
class BookModelTestCase(TestCase):
def setUp(self):
super(TestCase, self).setUp()
self.book = Book(
isbn='0195153448',
book_title='Classical Mythology',
book_author='Mark P. O. Morford',
year_of_publication='2002',
publishers='Oxford University Press',
image_url_s='http://images.amazon.com/images/P/0195153448.01.THUMBZZZ.jpg',
image_url_m='http://images.amazon.com/images/P/0195153448.01.MZZZZZZZ.jpg',
image_url_l='http://images.amazon.com/images/P/0195153448.01.LZZZZZZZ.jpg'
)
def test_valid_book(self):
self._assert_book_is_valid()
def test_isbn_must_not_be_blank(self):
self.book.isbn = None
self._assert_book_is_invalid()
def test_isbn_must_not_be_over_13_numbers(self):
self.book.isbn = '1' * 14
with self.assertRaises(ValidationError):
self.book.full_clean()
def test_isbn_can_be_13_numbers(self):
self.book.isbn = '1' * 13
self._assert_book_is_valid()
def test_isbn_must_be_unique(self):
second_book = self._create_second_book()
self.book.isbn = second_book.isbn
self._assert_book_is_invalid()
def _create_second_book(self):
book = Book(
isbn='0002005018',
book_title='Clara Callan',
book_author='Richard Bruce Wright',
year_of_publication='2001',
publishers='HarperFlamingo Canada',
image_url_s='http://images.amazon.com/images/P/0002005018.01.THUMBZZZ.jpg',
image_url_m='http://images.amazon.com/images/P/0002005018.01.MZZZZZZZ.jpg',
image_url_l='http://images.amazon.com/images/P/0002005018.01.LZZZZZZZ.jpg'
)
return book
def _assert_book_is_valid(self):
try:
self.book.full_clean()
except ValidationError:
self.fail('user should be valid')
def _assert_book_is_invalid(self):
with self.assertRaises(ValidationError):
self.book.full_clean()
`