代码之家  ›  专栏  ›  技术社区  ›  Thierry Lam

在Django的多表继承中,可以重写upload-to参数吗?

  •  2
  • Thierry Lam  · 技术社区  · 15 年前

    对于以下代码:

    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。以上是实现我目标的唯一方法还是有烘干机的方法?

    2 回复  |  直到 15 年前
        1
  •  7
  •   andylei    15 年前

    这个 upload_to 参数是可调用的,因此可以传入函数。你可以这样做:

    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)
    
        2
  •  0
  •   sheats    15 年前

    这是我能想到的最干燥的方法。

    编辑: 我意识到我的回答不是最有用的——对不起!然而,andylei的答案是可行的,但是您仍然需要创建子类。如果您要创建子类,我会选择显式的。根据 Unix Philosophy 明晰胜于聪明。安迪莱的回答可能很聪明,但它增加了不必要的复杂性,而没有增加任何真正的优势。编写代码以便于阅读和维护。我可以肯定地看到一个案例,在这个案例中,您可能不想将文件夹命名为与类名相同的名称。