我最终做的是列出模型的所有依赖项(通过确定一个规范的应用程序/名称对;从
django.db.models.fields.related
确定)并修改
class_prepared
信号处理程序监听所有模型,而不仅仅是我的目标模型。
当处理程序识别出我的依赖项列表中的模型时,它将从列表中删除该模型并检查该列表是否为空;如果为空,则可以创建审计模型。重要的是要断开
类制备
处理程序在创建模型之前,我遇到了无限递归(或者我可以更具体地封闭处理程序)。
dependencies = []
for field in cls._meta.local_fields:
while isinstance(field, (models.OneToOneField, models.ForeignKey)):
if isinstance(field.rel.to,basestring):
dependencies.append(get_canonical(cls,field.rel.to))
break
else:
field = field.rel.get_related_field()
def _contribute(sender, **kwargs):
key = (sender._meta.app_label, sender.__name__)
if key in dependencies:
dependencies.remove(key)
if not dependencies:
models.signals.class_prepared.disconnect(_contribute)
model = create_audit_model(cls)
models.signals.class_prepared.connect(_contribute, weak=False)