Дублирующее значение Django нарушает ограничение уникальности при использовании Objects.create()
У меня есть этот объект для файлов сохранения:
class File(Base):
title = models.CharField(max_length=512, default="arquivo", verbose_name=_('Title'), blank=False)
filename = models.FileField(max_length=512, verbose_name=_('File'), help_text=_("Select the logo file."), blank=False, null=False)
slug = models.SlugField(max_length=512, verbose_name=_('Slug'), blank=False, null=False)
extension = models.CharField(max_length=16, verbose_name=_('Extension'), blank=True, null=False)
mimetype = models.CharField(max_length=256, verbose_name=_('Mimetype'), blank=True, null=False)
size = models.IntegerField(blank=False, verbose_name=_('Size'), null=False)
def save(self, *args, **kwargs):
self.title = self.filename
self.extension = self.filename.url.split('.')[-1]
self.slug = slugify(self.filename)
self.mimetype = self.filename.file.content_type
self.size = self.filename.file.size
super().save(*args, **kwargs) # Call the "real" save() method.
# rename the file to new id pattern
file_id = ('file_%019d' % self.id)
current_directory = os.path.dirname(self.filename.path)
os.rename(self.filename.path, f'{current_directory}/{file_id}')
self.filename = file_id
super().save(*args, **kwargs)
Метод save() работает, когда я добавляю один файл через страницу администратора, FileAdmin:
@admin.register(File)
class FileAdmin(admin.ModelAdmin, Base):
form = FileModelAdminForm
def save_model(self, request, instance, form, change):
return Base.custom_save_model(self, request, instance, form, change)
Но, когда я пытаюсь создать объекты File с помощью File.objects.create(filename=file, user=request.user)
return IntegrityError: duplicate key value violates unique constraint "core_file_pkey"
ПОДРОБНАЯ ИНФОРМАЦИЯ: Ключ (id)=(id_number
) уже существует.
Вот код:
number_file = request.FILES.get('number_file')
f = File.objects.create(filename=number_file, user=request.user)
Объект создается в базе данных, но без обновления имени файла. Проблема во втором super().save(*args, **kwargs)
, но почему это работает при обычной вставке на Django Admin Page?
похоже, что вы вызываете метод save дважды, поэтому при повторном вызове он выдает ошибку Integratiy error
поэтому перепишите метод сохранения следующим образом и удалите первый super().save(*args, **kwargs)
def save(self, *args, **kwargs):
self.title = self.filename
self.extension = self.filename.url.split('.')[-1]
self.slug = slugify(self.filename)
self.mimetype = self.filename.file.content_type
self.size = self.filename.file.size
#super().save(*args, **kwargs) # remove this line
# rename the file to new id pattern
file_id = ('file_%019d' % self.id)
current_directory = os.path.dirname(self.filename.path)
os.rename(self.filename.path, f'{current_directory}/{file_id}')
self.filename = file_id
super().save(*args, **kwargs)