Я хочу сохранить свои файлы, используя первичный ключ записи.
Вот мой код:
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. Нет проблем.