Ty.*_*Ty. 10 python django file-io
我想使用条目的主键保存我的文件.
这是我的代码:
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)
Run Code Online (Sandbox Code Playgroud)
我知道第一次保存对象时主键不可用,所以我愿意采取额外的命中来保存对象只是为了得到主键,然后继续.
上面的代码不起作用.它会引发以下错误:
maximum recursion depth exceeded while calling a Python object
Run Code Online (Sandbox Code Playgroud)
我假设这是一个无限循环.调用该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)
Run Code Online (Sandbox Code Playgroud)
而不是在我的模型中强制执行必需的字段,我将在我的Form类中执行它.没问题.
看来您需要File首先使用空文件字段预先生成模型。然后选择一个并将其与给定的文件对象一起保存。
您可以有一个像这样的自定义管理器方法;
def create_with_pk(self):
instance = self.create()
instance.save() # probably this line is unneeded
return instance
Run Code Online (Sandbox Code Playgroud)
但如果需要您的任何一个字段,这就会很麻烦。由于您最初创建的是空对象,因此无法在模型级别强制执行必填字段。
create_with_pk应该是一个自定义管理器方法,在您的代码中它只是一个常规方法。因此self是没有意义的。这一切都通过示例正确记录。
| 归档时间: |
|
| 查看次数: |
4899 次 |
| 最近记录: |