我有一个 django 模型,它需要参考自定义用户模型进行一些处理。
我不能在类加载时使用这个模型的类,因为类的加载顺序是未知的。
所以我需要在运行时添加一些类属性,目前我将它们添加到__init__
或__new__
类似:
def __new__(cls, *args, **kwargs):
# hack to avoid INSTALLED_APPS initialization conflicts.
# get_user_model() can't be called from this module at class loading time,
# so some class attributes must be added later.
# Metaclasses could me more appropiate but I don't want to override
# dango's metaclasses.
if not hasattr(cls, '_reverse_field_name_to_user'):
cls._find_reverse_field_name_to_user()
return Group.__new__(cls, *args, **kwargs)
它有效,但看起来很可怕,所以我考虑过使用类似的东西@lazyclassproperty
来处理这些属性。
我找到了几个@classproperty
和@lazyproperty
装饰器,但两者都没有,而且我不知道如何自己写一个。
问题:我如何编写这样的装饰器?或建议我目前愚蠢的实施的另一种更清洁的替代方案。