我有一个基类Image,我在其中设置了上传目录。 这完全适用。 因为,据我所知,到目前为止,不可能覆盖Django中父类的字段,我想我会这样尝试。
class Image(models.Model):
"""
Images base class
"""
upload_directory = "uploads/images"
image = models.ImageField(upload_to=upload_directory)
但是当覆盖子类中的upload_directory
时,这根本就没有结果。现在,图像仍然上载到父类中设置的目录中。
class ActivityThumbnail(Image):
"""
Thumbnail images for activities
"""
upload_directory = "uploads/images/thumbnails/activities"
为每个子类设置上传目录路径的正确方法是什么?
答案 0 :(得分:1)
在您的情况下,您应该使用函数来获取上传路径,包括文件名。
def upload_to_path(instance, filename):
return '{upload_dir}/{filename}'.format(
upload_dir=instance.upload_dir,
filename=filename
)
class Image(models.Model):
"""
Images base class
"""
upload_dir = "uploads/images"
image = models.ImageField(upload_to=upload_to_path)
class ActivityThumbnail(Image):
"""
Thumbnail images for activities
"""
upload_dir = "uploads/images/thumbnails/activities"
看看这个https://docs.djangoproject.com/en/1.8/ref/models/fields/#django.db.models.FileField.upload_to
答案 1 :(得分:0)
您正在混合类变量和实例变量。
当您处理类变量(相当于Java和C ++中的静态变量)时,您应始终使用<class-name>.<variable-name>
惯例。虽然使用实例名称访问它是合法的。
这样做会让您意识到您不需要为每个实例设置新的upload_dir,因此您可以在该流/循环之外进行更多全局初始化。
class base:
var1 = 'from base'
# can do without this
@classmethod
def set_var1(cls, v):
cls.var1 = v
print 'before derived definitions: base.var1', base.var1
# wrong..
class derived1(base):
# This is a different variable (FQDN: derived1.var1), it DOES NOT override the base.var1
var1 = 'from derived1'
print 'after derived1 definition: base.var1', base.var1
# correct..
class derived2(base):
# don't create a new variable derived2.var1
pass
b = base()
d1 = derived1()
d2 = derived2()
base.var1 = 'overridden from main'
print '\nbase.var1', base.var1, 'b.var1', b.var1
print 'derived1.var1', derived1.var1, 'd1.var1', d1.var1
print 'derived2.var1', derived2.var1, 'd2.var1', d2.var1
# if you want to complicate things and make it look like you know $#!T
# create a classmethod, annotated appropriately to set the new value
base.set_var1('overridden from main 2')
print '\nbase.var1', base.var1, 'b.var1', b.var1
print 'derived1.var1', derived1.var1, 'd1.var1', d1.var1
print 'derived2.var1', derived2.var1, 'd2.var1', d2.var1
# if you REALLY wanna complicate things, e.g. because you have no control over
# code in base.py then you should be able to use the python RTTI functions and
# hack your way to set teh value on appropriate cls object using __set_attribute__
打印:
before derived definitions: base.var1 from base
after derived1 definition: base.var1 from base
base.var1 overridden from main b.var1 overridden from main
derived1.var1 from derived1 d1.var1 from derived1
derived2.var1 overridden from main d2.var1 overridden from main
base.var1 overridden from main 2 b.var1 overridden from main 2
derived1.var1 from derived1 d1.var1 from derived1
derived2.var1 overridden from main 2 d2.var1 overridden from main 2