相关疑难解决方法(0)

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

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

这是我的代码:

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) …
Run Code Online (Sandbox Code Playgroud)

python django file-io

10
推荐指数
1
解决办法
4899
查看次数

Django:有什么方法可以改变FileField的"upload_to"属性而不诉诸魔术?

看到这篇博客文章 ...它已经很老了,所以也许情况发生了变化.但在我的实验中他们没有.为了upload_to动态更改模型字段FileField 路径,您必须求助于使用signals和创建自定义model fields.讨厌.我无法想象拥有动态上传路径是一个特殊的用例,标准的Django框架无法解决这个问题.我错过了什么吗?有没有其他方法可以实现这一目标?

本质上我想这样做:

def MyModel(models.Model):
    fileUpload = models.FileField(upload_to='media/', null=True, blank=True)

def save(self, **kwargs):
    # Retrieve the user's id/pk from their profile
    up = UserProfile.objects.get(email=self.email)

    # All their uploads go into their own directory
    self.file_image.upload_to = up.id

    super(MyModel, self).save()
Run Code Online (Sandbox Code Playgroud)

然而,在我尝试的10种不同的实现中,Django讨厌所有这些.特别是对于这个,文件被上传到默认路径'media/'.

我已经尝试抓取参数的模型表并将这些参数传递到dict对象,创建MyModel对象,设置MyModel.fileUpload.upload_to参数,然后将dict复制到模型中并保存.不行.

我也试图覆盖这个__init__方法,但猜猜是什么?那是在对象创建的早期,它实际上还没有self.email定义!所以这不起作用.

任何想法或我必须遵循原始链接中概述的神秘解决方案?

python django

2
推荐指数
1
解决办法
5440
查看次数

标签 统计

django ×2

python ×2

file-io ×1