【问题标题】:Django: How can I find which of my models refer to a modelDjango:我怎样才能找到我的哪些模型引用了一个模型
【发布时间】:2011-11-24 06:05:26
【问题描述】:

我想警告或阻止用户删除其他实例引用的对象实例。有什么好办法吗?

一种方法是获取包含所指对象的模型列表,然后尝试对其进行反向查找。有没有办法获得该模型列表?还是有更好的办法?

在调查收集器建议时,我找到了一些相关信息并编写了以下内容,以查找具有引用作为外键的类:

def find_related(cl, app):
    """Find all classes which are related to the class cl (in app) by 
    having it as a foreign key."""

    from django.db import models

    all_models = models.get_models()
    ci_model = models.get_model(app, cl)
    for a_model in all_models:
        for f in a_model._meta.fields:
            if isinstance(f, ForeignKey) and (f.rel.to == ci_model):
                print a_model.__name__

基于使用collect代码的建议:

def find_related(instance):
"""Find all objects which are related to instance."""

for related in instance._meta.get_all_related_objects():
    acc_name = related.get_accessor_name()
    referers = getattr(instance, acc_name).all()
    if referers:
        print related

【问题讨论】:

  • 感谢您使用最终解决方案更新此问题。出色的工作。
  • 你有find_related 使用(cl, app),而get_model 使用(app, cl)。真的很混乱!此外,如果其他人正在阅读本文,clapp 是字符串 - 不要传递对象!

标签: django


【解决方案1】:

Django 有一个叫做Collector 的类。 Django 在执行模型删除时使用它。它所做的似乎正是您想要的。通过调用collect(),它会在模型​​图中找到对该对象的所有引用。此外,它还提供了一种通过delete() 调用删除所有找到的对象的方法。

也就是说我自己从未使用过这个类,我只知道它存在。 API 有点复杂,但如果您愿意深入了解 Django 的内部结构,它可能会为您节省大量编码。

【讨论】:

  • 这看起来很有希望,但我使用的是 1.0,它只有 Collector 的前身——CollectedObjects,它看起来不像有类似的方法。 CollectedObjects 在 (stackoverflow.com/questions/437166/…) 中用于查找要删除的实例引用的对象。
  • 我们是否可以假设 (a) 您有充分的理由不能升级到更新的版本,并且 (b) 同样您也不能单独使用收集器?
  • @Mitch:是的,我同意 Marcin 的观点,如果您无法升级,您可以随时尝试使用 Collector.collect() 实现作为您自己代码的基础。 django代码总体来说还不够干净,但经过一番分析,应该还是可以用的。
  • 谢谢。我看了collect,只需要使用一小部分来做我想做的事。另一个参考是:stackoverflow.com/questions/2233883/…
猜你喜欢
  • 2021-10-01
  • 2020-02-07
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
相关资源
最近更新 更多