2009-12-08 60 views
2

对于下面的代码:在Django的多表继承中,可以覆盖upload_to参数吗?

class Image(models.Model): 
    alt_name = models.CharField(max_length=200) 
    url = models.CharField(max_length=255, blank=True) 

class Button(Image): 
    source = models.ImageField(max_length=1024, upload_to='buttons') 

class Snapshot(Image): 
    source = models.ImageField(max_length=1024, upload_to='snapshots') 

class Banner(Image): 
    source = models.ImageField(max_length=1024, upload_to='banners') 

在上述情况下,我想每一个不同类型的上传到自己的文件夹上传。例如,横幅将位于名为banners的文件夹下,并且快照将在snapshots之下。上述工作如预期,但我重复每个子类的ImageField。上述是实现我的目标的唯一方法还是存在DRYer方法?

回答

7

upload_to参数是可调用的,所以你可以传入一个函数。你可以做这样的事情:http://docs.djangoproject.com:

import os 
def upload_path(instance, filename): 
    return os.path.join(instance.__class__.__name__ + 's', filename) 

class Image(models.Model): 
    alt_name = models.CharField(max_length=200) 
    url = models.CharField(max_length=255, blank=True) 
    source = models.ImageField(max_length=1024, upload_to=upload_path) 
+0

..而不是使用继承为每个图像类型,我会在包括选择图像模式kwarg创建IntegerField/en/dev/ref/models/fields /#选项 ...然后触发IntegerField值的upload_to值。如果可以避免的话,在图像表上查询加入是没有意义的。 – 2009-12-09 00:03:42

0

这是我能想到的DRYest方式。

编辑: 我意识到我的回答并不是最有用的 - 对不起!然而,andylei的答案会起作用,但你仍然需要创建你的子类。如果你打算创建子类,我会选择明确的。根据Unix Philosophy,Clarity比Cleverness好。安迪利的答案可能很聪明,但它增加了不必要的复杂性,而没有增加任何真正的优势。编写代码以便读取和维护。我绝对可以看到一个情况,你可能不想将你的文件夹命名为与你的班级名称相同的名称。