Дублирующее значение 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)
Вернуться на верх