在 base class 和 Meta class 之间共享数据
Share data between base class and Meta class
我有以下 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')
]
如您所见,我在基础 class 和元 class 中都定义了相同的列表 ['filename'、'collection']。我想定义一次。我无法在 Meta 中定义它,因为那时我得到“Meta 有一个无法识别的属性 'keys'”。所以我必须在基础 class 中定义它并从 Meta 访问它。我不知道如何在两者之间共享数据。我试过:
self.keys
在 Meta 中,但这给出了 'self is not defined'。我也试过 'keys' 但这也没有定义。有小费吗?谢谢
编辑
感谢 Willem 指出我可以在 Meta 中定义键,只要我将它称为“_keys”即可。但是,如果我这样做,问题是我如何从基 class 访问 _keys?我试过 'meta._keys' 和 'Meta._keys'。两者均未定义。
编辑 2
为清楚起见,我希望在基础 class 中定义 'keys' 的原因是我将 (a) 从基础 class 上的属性访问它,并且 (b) 想要能够从外部访问它。
嵌套class的方法不能直接访问外部class的实例属性。
因此,在您的情况下,如果您不使用 Article
class 中的 keys
列表,只需在 Meta
[=] 中定义一次即可17=]。否则需要定义两次!
您可以在 class 之前声明它,然后从模型 class 和它的 Meta:
中引用它
# 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._meta.contraints[0].fields
或类似的东西访问这些值(没有现在手头有这些约束的模型,所以我可以检查模型的 metaclass 实际上是如何转换的,但是检查 django shell 中的 self._meta
应该会给你答案)。
我有以下 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')
]
如您所见,我在基础 class 和元 class 中都定义了相同的列表 ['filename'、'collection']。我想定义一次。我无法在 Meta 中定义它,因为那时我得到“Meta 有一个无法识别的属性 'keys'”。所以我必须在基础 class 中定义它并从 Meta 访问它。我不知道如何在两者之间共享数据。我试过:
self.keys
在 Meta 中,但这给出了 'self is not defined'。我也试过 'keys' 但这也没有定义。有小费吗?谢谢
编辑 感谢 Willem 指出我可以在 Meta 中定义键,只要我将它称为“_keys”即可。但是,如果我这样做,问题是我如何从基 class 访问 _keys?我试过 'meta._keys' 和 'Meta._keys'。两者均未定义。
编辑 2 为清楚起见,我希望在基础 class 中定义 'keys' 的原因是我将 (a) 从基础 class 上的属性访问它,并且 (b) 想要能够从外部访问它。
嵌套class的方法不能直接访问外部class的实例属性。
因此,在您的情况下,如果您不使用 Article
class 中的 keys
列表,只需在 Meta
[=] 中定义一次即可17=]。否则需要定义两次!
您可以在 class 之前声明它,然后从模型 class 和它的 Meta:
中引用它# 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._meta.contraints[0].fields
或类似的东西访问这些值(没有现在手头有这些约束的模型,所以我可以检查模型的 metaclass 实际上是如何转换的,但是检查 django shell 中的 self._meta
应该会给你答案)。