Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.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 在基类和元类之间共享数据_Python_Django_Model_Metaclass - Fatal编程技术网

Python 在基类和元类之间共享数据

Python 在基类和元类之间共享数据,python,django,model,metaclass,Python,Django,Model,Metaclass,我有以下django型号: class Article(models.Model): filename = models.CharField(max_length=255) collection = models.ForeignKey(Collection, on_delete=models.CASCADE) keys = ['filename', 'collection'] class Meta: constraints = [

我有以下django型号:

class Article(models.Model):
    filename = models.CharField(max_length=255)
    collection = models.ForeignKey(Collection, on_delete=models.CASCADE)

    keys = ['filename', 'collection']

    class Meta:
        constraints = [
                models.UniqueConstraint(
                    fields=['filename', 'collection'],
                    name='article_key')
                ]
如您所见,我在基类和元类中定义了相同的列表['filename','collection']。我想定义一下。我不能在Meta中定义它,因为这样我会得到“Meta有一个无法识别的属性”“keys”。所以我必须在基类中定义它,并从Meta访问它。我不知道如何在两者之间共享数据。我试过做:

self.keys
在Meta中,但这给出了“自我未定义”。我也尝试过只使用“键”,但也没有定义。有什么建议吗?谢谢

编辑 感谢Willem指出我可以在Meta中定义键,只要我称之为“\u键”。但是,如果我这样做,问题是如何从基类访问_键?我试过“meta.\u键”和“meta.\u键”。两者都没有定义

编辑2
为清楚起见,我希望在基类中定义“键”的原因是:(a)从基类的属性访问它,以及(b)希望能够从外部访问它。

嵌套类的方法不能直接访问外部类的实例属性


因此,在您的情况下,如果不使用
文章
类中的
列表,只需在
类中定义一次即可。否则,您需要定义两次

您可以在类之前声明它,然后从模型类和它的元引用它:

# making it a tuple since you probably don't want
# it to be mutable
_ARTICLE_KEYS = ('filename', 'collection')

class Article(models.Model):
    # making it an implementation attribute since you
    # probably don't want to be writeable 
    # (hint: provide a read-only property for access)

    _keys = _ARTICLE_KEYS

    class Meta:
        constraints = [
                models.UniqueConstraint(
                    fields=_ARTICLE_KEYS,
                    name='article_key')
                ]

但是这仍然是丑陋的,而且很可能是不必要的-模型的方法应该能够通过
self.\u meta.containts[0]。字段
或类似的东西来访问这些值(目前手头没有此类约束的模型,因此我可以检查模型的元类如何实际转换这些约束,但检查
self.\u django shell中的meta
应该会给出答案).

如果meta以下划线开头,您可以在其中添加任何可能的属性。您不能执行
文章吗?@FiddleStix尝试过,文章没有定义…您在嵌套类中看到过方法吗?这是一个属性,而不是方法。总之:这是Django ORM代码,以及嵌套的
meta
类被模型元类转换为一个
Options
实例(模型类的属性),因此模型的方法类可以通过
self.\u meta
(或
cls.\u meta
)访问它。是的,你是对的,它是一个属性。但是在你的例子中,你展示了从
外部类的访问。但是问题是关于嵌套类。外部类。attr,因为他想在嵌套类中使用外部类的属性。op想要的是在两个类中都使用相同的对象,而不重复它。Whe其中一个定义在这里并不重要;-)