【问题标题】:Django model class and custom propertyDjango 模型类和自定义属性
【发布时间】:2010-06-15 15:01:38
【问题描述】:

今天我遇到了一个奇怪的问题:

我在 Django 中有一个模型类,并为其添加了一个自定义属性,该属性不应保存到数据库中,因此在模型结构中不具有代表性:

class Category(models.Model):
    groups = models.ManyToManyField(Group)
    title = defaultdict()

现在,当我在 shell 中或编写测试时,我会执行以下操作:

c1 = Category.objects.create()
c1.title['de'] = 'german title'
print c1.title['de'] # prints "german title"

c2 = Category.objects.create()  
print c2.title['de'] # prints "german title" <-- WTF?

似乎“标题”是一种全球性的。如果我将标题更改为一个简单的字符串,它会按预期工作,所以它必须对字典做些什么?我还尝试将标题设置为属性:

title = property(_title)

但这也不起作用。那么,我该如何解决呢?提前谢谢!

编辑:

以下是基础问题的目的,即根据要求为您提供更好的整个周围环境的视图: 在我们的模型结构中,我们有一个存储翻译的模型类。这个类与所有其他相互有关系的类没有约束力。翻译类存储翻译值、语言键、翻译键以及翻译所属的包和类。一些模型类可以具有可以翻译成不同语言的属性。这些属性没有映射到 Django 模型结构中,因为这在我们看来是不可能的。这些具有可翻译属性的类中的每一个(我们称它们为可翻译的)都可以具有这些属性中的一个或多个。这就是翻译密钥的用途。例如。如果有一个具有可翻译属性“title”的类 Category,模型翻译会将“module.somewhere.Category”存储为包/类,“title”作为翻译键,例如对于德语,翻译值“Kategorie”和语言键“de”。 我的目标是简化对这些属性的访问。所以所有这些模型类都继承自一个名为“Translatable”的普通类。它有一个用于解析模块路径和类名称的方法(用于稍后存储在翻译数据库表中)和一个采用属性名称的“_propertize”方法。属性实例化一个类“翻译器”,该类对于每个可翻译属性名称都是唯一的。这个类从翻译模型类中解析真正的翻译值,并自动解析当前选择的语言的翻译。

【问题讨论】:

    标签: python django class django-models


    【解决方案1】:

    不要那样做。您的 title 属性完全是“全局的”。它是类的一部分,而不是每个实例的一部分。

    做这样的事情。

    class Category(models.Model):
        groups = models.ManyToManyField(Group)
        @property
        def title(self):
            return self._title
        def save( self, *args, **kw  ):
            try:
                self._title
            except AttributeError:
                self._title= defaultdict()
            super( Category, self ).save( *args, **kw )
    

    如果您可以定义您的实际用例,则可能会大大简化这一点。

    【讨论】:

    • 谢谢,这让我更清楚了。但是我如何在你的例子中定义 self._title ?我的实际用例有点奇怪,我有原则上具有可翻译属性的模型类。这些道具不能直接放入模型中,例如在类别中可以有 6 种不同语言的字段标题。一个类也可以具有多个这些可翻译属性。我们创建了一个类 Translatable,每个模型类都继承自(也继承自 models.Model),它有一个方法,其中包含与属性相关联的 dict。
    • @dArignac:你没有“定义”任何东西。 self._title 将默认字典保存在实例中。 Python 中没有“定义”任何内容。 Django中的字段“definitions”在构造类的时候偷偷的构建属性和方法。
    • @dArignac:“我的实际用例有点奇怪……”请用您的实际用例更新问题。请包括详细信息,请具体并更新问题。
    • @S.Lott 在我看来,这个问题已经足够具体了,因为我把它分解到无法正常工作的地步;)为了描述我可以写一篇文章的真实用例,这将超出范围这个的。不过非常感谢!
    • @dArignac:“在我看来,这个问题已经足够具体了”。我不是你,也不会分享你的洞察力或理解力。如果您需要其他人的帮助,您必须屈服于我们的理解水平,并足够详细地描述您的问题,以便我们可以提供帮助。
    猜你喜欢
    • 2022-10-15
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多