这是一个有效的解决方案,使用
Model._meta
API
,但我不确定这是否是最好的方法。希望得到更好的答案。
基本上,给定一个对象,我们会得到一个它的反向关系列表,然后,对于其中的每一个,我们会检查关系中是否有任何对象。
obj = Reporter.objects.first()
obj_has_reverse = False
if obj.id is not None:
for reverse in [f for f in obj._meta.get_fields()
if f.auto_created and not f.concrete]:
name = reverse.get_accessor_name()
has_reverse_one_to_one = reverse.one_to_one and hasattr(obj, name)
has_reverse_other = not reverse.one_to_one and getattr(obj, name).count()
if has_reverse_one_to_one or has_reverse_other:
obj_has_reverse = True
注意,与
ForeignKey
和
ManyToManyField
返回A
RelatedManager
所以我们可以检查
count()
. 然而,与
OneToOneField
不返回
RelatedManager
. 它提出了一个
DoesNotExist
如果没有相关对象,则出现异常,如
docs
.
也看到
source
对于
reverse_related
.