Я хочу сохранить свои файлы, используя первичный ключ записи.
Вот мой код:
def get_nzb_filename(instance, filename):
if not instance.pk:
instance.save() # Does not work.
name_slug = re.sub('[^a-zA-Z0-9]', '-', instance.name).strip('-').lower()
name_slug = re.sub('[-]+', '-', name_slug)
return u'files/%s_%s.nzb' % (instance.pk, name_slug)
class File(models.Model):
nzb = models.FileField(upload_to=get_nzb_filename)
name = models.CharField(max_length=256)
Я знаю, что при первом сохранении объекта первичный ключ недоступен, поэтому я готов сделать дополнительный удар, чтобы сохранить объект, просто чтобы получить первичный ключ, а затем продолжить.
Приведенный выше код не работает. Выдает следующую ошибку:
maximum recursion depth exceeded while calling a Python object
Я предполагаю, что это бесконечный цикл. Вызов метода save
вызовет метод get_nzb_filename
, который снова вызовет метод save
и т. Д.
Я использую последнюю версию ствола Django.
Как получить первичный ключ, чтобы использовать его для сохранения загруженных файлов?
Обновление @muhuk:
Мне нравится ваше решение. Можете ли вы помочь мне реализовать это? Я обновил свой код до следующего, и ошибка 'File' object has no attribute 'create'
. Возможно, я использую то, что вы написали вне контекста?
def create_with_pk(self):
instance = self.create()
instance.save()
return instance
def get_nzb_filename(instance, filename):
if not instance.pk:
create_with_pk(instance)
name_slug = re.sub('[^a-zA-Z0-9]', '-', instance.name).strip('-').lower()
name_slug = re.sub('[-]+', '-', name_slug)
return u'files/%s_%s.nzb' % (instance.pk, name_slug)
class File(models.Model):
nzb = models.FileField(upload_to=get_nzb_filename, blank=True, null=True)
name = models.CharField(max_length=256)
Вместо обязательного заполнения поля в моей модели я сделаю это в своем классе Form. Нет проблем.