获取所有相关的Django模型对象
我怎么才能得到一个列表,里面是所有指向某个对象的模型对象?(就像Django管理后台在执行删除操作前的确认页面那样)。
我想找一个通用的方法来合并数据库中的重复对象。基本上,我想把所有指向对象“B”的外键对象更新为指向对象“A”,这样我就可以在不丢失重要数据的情况下删除“B”。
谢谢你的帮助!
9 个回答
9
这段代码的意思是,首先我们创建一个叫做 `links` 的列表,这个列表里会存放与某个对象相关的所有对象的名称。具体来说,它是通过遍历一个对象的所有相关对象来实现的。
接下来,你可以用类似下面的方式来获取所有相关的对象:
for link in links:
objects = getattr(a, link.name).all()
for object in objects:
# do something with related object instance
这段内容来自Django 1.10的官方文档:
MyModel._meta.get_all_related_objects() 这个方法变成了:
[
f for f in MyModel._meta.get_fields()
if (f.one_to_many or f.one_to_one)
and f.auto_created and not f.concrete
]
所以根据这个示例,我们可以这样使用:
links = [
f for f in MyModel._meta.get_fields()
if (f.one_to_many or f.one_to_one)
and f.auto_created and not f.concrete
]
for link in links:
objects = getattr(a, link.name).all()
for object in objects:
# do something with related object instance
28
@digitalPBK 的回答很接近了……这里可能是你在寻找的内容,使用了 Django 自带的功能,这些功能在 Django 管理后台中用于在删除时显示相关对象。
from django.contrib.admin.utils import NestedObjects
collector = NestedObjects(using="default") #database name
collector.collect([objective]) #list of objects. single one won't do
print(collector.data)
这样你就可以创建 Django 管理后台显示的内容——要删除的相关对象。
95
Django <= 1.7
这段代码可以帮你找到所有相关对象的属性名称:
links = [rel.get_accessor_name() for rel in a._meta.get_all_related_objects()]
然后你可以用类似下面的方式来获取所有相关的对象:
for link in links:
objects = getattr(a, link).all()
for object in objects:
# do something with related object instance
我花了一段时间来弄明白这个,以便在我的一个模型上实现一种“观察者模式”。希望这对你有帮助。
Django 1.8+
可以使用 _meta.get_fields()
方法:https://docs.djangoproject.com/en/1.10/ref/models/meta/#django.db.models.options.Options.get_fields(在 _get_fields()
的源代码中也可以看到反向关系)