Django - 通过ForeignKey属性将参数传递给模型

时间:2011-01-14 06:22:44

标签: python django django-models

我有一个这样的课程:

class Image (models.Model):
    ...
    sizes = ((90,90), (300,250))

    def resize_image(self):
        for size in sizes:
            ...

和另一个这样的课程:

class SomeClassWithAnImage (models.Model):
    ...
    an_image = models.ForeignKey(Image)

我想对这个课程做什么是这样的:

class SomeClassWithAnImage (models.Model):
    ...
    an_image = models.ForeignKey(Image, sizes=((90,90), (150, 120)))

我可以指定我希望Image类将其自身调整为参数而不是在类上进行硬编码的大小。我知道如果直接调用resize_image,我可以在调用resize_image时传递这些内容但是当对象持久保存到db时会自动调用resize_image方法。

如果我尝试通过这样的外键声明传递参数,我会马上得到一个错误。在我开始攻击django之前,是否有一种简单/更好的方法可以做到这一点?

2 个答案:

答案 0 :(得分:0)

Django中对象的所有属性都存储在数据库中,因此您必须在模型中将大小设置为Field。您不能只设置随机属性并期望它们持久存在。

由于没有用于元组列表的字段,您要么必须使用文本字段来填充它,要么编写ListOfTuplesField,或者更好的是继承自ListOfTuplesField的ImageSizesField。您必须编写代码以将其序列化到数据库(转换为文本可能是最简单的方法)并且还要将其解析回来,或者某处可能存在JSONField类型。

所以现在你的SomeClassWithAnImage模型有一个到Image的ForeignKey和一个ImageSizesField。保存后,您的overriden save()方法将使用ImageSizesField中的值调用Image的resize方法。

如果另一个SomeClassWithAnImage指向同一个Image会发生什么?

答案 1 :(得分:0)

你可能会把它推上山;尝试将参数应用于FK是不常见的。

您的细节的传统解决方案是使用缩略图(如“sorl”)在交付前立即进行缩略图替换 - 即:在模板中例如:

{% thumbnail myobj.image 500 500 %}

虽然我个人已经在我的类中添加了例程,以便更容易访问这些缩略图。例如:

def thumbnail(self):
     path = # work out the path to the thumbnail
     try:
         #access the path where I expect the thumbnail file to be
     except #failure:
         # generate the thumbnail using the dimensions specified by the class
     return #path to the thumbnail