У меня есть модель категории, для идентификации ее в телеграм боте, я использую поле pk_for_telegram, куда записывается строчка, содержащий id категории. Соответственно id появляется только после сохранения экземпляра, мое решение такое:
class Category(models.Model):
'''Модель категорий'''
name = models.CharField(max_length=255, help_text='Имя категории')
photo = models.ImageField(upload_to='category_img/', help_text='Фото категории')
slug = models.SlugField(max_length=100, unique=True)
pk_for_telegram = models.CharField(max_length=255, unique=True, blank=True, null=True, help_text='Используется в боте для поиска категории') # Нужен для идентификации в телеграм боте
max_count_product = models.IntegerField()
def save(self, *args, **kwargs):
self.slug = slugify(self.name)
super(Category, self).save(*args, **kwargs)
self.pk_for_telegram = f'c||{self.pk}'
super(Category, self).save(*args, **kwargs)
def __str__(self):
return self.name
В приложении это работает правильно. Но я захотел покрыть свой код тестами, и встретился с такой ошибкой, из за того что метод save() используется 2 раза, он пробует сохранить экземпляр 2 раза и бросает ошибку
django.db.utils.IntegrityError: UNIQUE constraint failed: main_app_category.id
При комментировании одного из .save() все проходит успешно, как решить этот вопрос?
Модель теста:
class ListProductViewTest(TestCase):
def setUp(self) -> None:
self.seller_user = User.objects.create(username='seller1', password='password')
self.super_user = User.objects.create(username='admin1', password='password', is_staff=True)
image = SimpleUploadedFile('image.jpg', content=b'', content_type='image/jpg')
self.category = Category.objects.create(name='category', photo=image, max_count_product=10)
self.subcategory = SubCategory.objects.create(name='subcategory', photo=image, category=self.category)
self.product = Product.objects.create(title='product', photo=image, price=Decimal('100.00'), count=10, weight=100, description='descrpit', subcategory=self.subcategory, )
def test_seller_requared(self):
factory = RequestFactory()
request = factory.get('')
request.user = self.seller_user
response = IndexView.as_view()(request)
self.assertEqual(response.status_code, 302)
def test_admin_requared(self):
factory = RequestFactory()
request = factory.get('')
request.user = self.super_user
response = IndexView.as_view()(request)
self.assertEqual(response.status_code, 200)