Django模型类和自定义属性
今天我遇到了一个奇怪的问题:
我在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'有点像是全局的。如果我把title改成一个简单的字符串,它就能正常工作,所以这可能和字典有关?我还尝试把title设置为一个属性:
title = property(_title)
但这也不行。那么,我该怎么解决这个问题呢?谢谢你们的帮助!
编辑:
这里是我问题的基本意图,给你们提供一个更清晰的背景环境,正如你们所要求的:在我们的模型结构中,有一个模型类用于存储翻译。这个类与其他有关系的类是分开的。翻译类存储翻译后的值、语言键、翻译键以及翻译所属的包和类。有些模型类可以有可以翻译成不同语言的属性。这些属性在Django模型结构中并没有被映射,因为我们认为这并不是真正可行的。每个具有可翻译属性的类,我们称之为可翻译类,可以有一个或多个这样的属性。这就是翻译键的作用。例如,如果有一个类Category,它有一个可翻译的属性"title",那么模型翻译将存储"module.somewhere.Category"作为包/类,"title"作为翻译键,而对于德语,翻译值将是"Kategorie",语言键是"de"。
我的目标是简化对这些属性的访问。因此,所有这些模型类都继承自一个叫做"Translatable"的普通类。这个类有一个方法用于解析模块路径和类名(以便稍后存储在翻译数据库表中),还有一个"_propertize"方法,它接受属性的名称。属性实例化一个名为"Translator"的类,这个类对于每个可翻译的属性名称都是唯一的。这个类负责从翻译模型类中解析真实的翻译值,以及一些用于自动解析当前选择语言的翻译的功能。
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 )
如果你能具体说明一下你的实际使用场景,可能会让这个问题简单很多。