当前位置:  开发笔记 > 编程语言 > 正文

Django:访问models.filefield(upload_to)位置的主键

如何解决《Django:访问models.filefield(upload_to)位置的主键》经验,为你挑选了0个好方法。

我想使用条目的主键保存我的文件.

这是我的代码:

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类中执行它.没问题.

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有