Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django模型类和自定义属性_Python_Django_Class_Django Models - Fatal编程技术网

Python Django模型类和自定义属性

Python Django模型类和自定义属性,python,django,class,django-models,Python,Django,Class,Django Models,你好-今天我遇到了一个奇怪的问题: 我在Django中有一个modle类,并向其中添加了一个自定义属性,该属性不应保存到数据库中,因此不在模型结构中表示: class Category(models.Model): groups = models.ManyToManyField(Group) title = defaultdict() 现在,当我在shell中或编写测试时,我会执行以下操作: c1 = Category.objects.create() c1.title['de

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

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

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?
但这也不起作用。那么,我该如何解决这个问题呢?提前谢谢你

编辑:

以下是基本问题的意图,以便按照要求更好地了解整个周围环境: 在我们的模型结构中,我们有一个存储翻译的模型类。该类与所有其他相互之间有关系的类无关。translation类存储翻译值、语言键、翻译键以及翻译所属的包和类。某些模型类可以具有可以翻译为不同语言的属性。这些属性没有映射到django模型结构中,因为这在我们眼中是不可能的。每个具有可翻译属性的类(我们称之为可翻译类)都可以具有一个或多个这些属性。这就是翻译的关键所在。例如,如果存在具有可翻译属性“title”的类类别,则模型翻译将“module.somewhere.Category”存储为包/类,“title”存储为翻译键,例如,对于德语,将翻译值“Kategorie”和语言键“de”。
我的目标是方便访问这些属性。所以所有这些模型类都继承自一个名为“translateable”的普通类。它有一个解析类的模块路径和名称的方法(用于以后存储在翻译数据库表中)和一个采用属性名称的“\u propertize”方法。Propertize实例化一个类“Translator”,该类对于每个可翻译的属性名都是唯一的。此类用于解析translation model类中的实际翻译值,以及自动解析当前所选语言的翻译的一些内容。

不要这样做。您的
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 )

如果您可以定义您的实际用例,那么可能会将其简化很多。

谢谢,这让我更清楚了。但我如何定义自我?在你的例子中是什么?我的实际用例有点奇怪,我有原则上具有可翻译属性的模型类。这些道具不能直接放在模型中,例如在类类别中可以有6种不同语言的字段标题aso。一个类也可以有多个这些可翻译属性。我们创建了一个可翻译的类,每个modelclass继承自(也继承自models.Model),该类有一个带有绑定到属性的dict的方法。@dArignac:您不“定义”任何内容
self.\u title
将默认字典保存在实例中。Python中没有“定义”任何内容。Django build属性和方法中的字段“definitions”在类构造时是秘密的。@dArignac:“我的实际用例有点奇怪…”请用实际用例更新问题。请包括详细信息,请具体说明,并请更新问题。@S.Lott我认为这个问题足够具体,因为我把它分解到了不起作用的地步;)为了描述真实的用例,我可以写一篇文章,这将超出本文的范围。但是非常感谢@达里格纳克:“在我看来,这个问题已经足够具体了。”。我不是你,也不分享你的洞察力和理解力。如果你想从别人那里得到帮助,你必须屈尊于我们的理解水平,并详细描述你的问题,以便我们能够提供帮助。
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 )