我正在编写一个shell实用程序,它允许我遍历关系,这样我就不需要回到我的模型,看看表是如何相关的。我正在使用_meta
来获取所有这些信息。
请看以下示例模型:
class Foo:
...
class Bar:
foo = models.ManyToManyField(Foo)
当我使用_meta
查找m2m字段时会发生这种情况:
In [33]: Bar._meta.many_to_many
Out [33]: [<django.db.models.fields.related.ManyToManyField: foos>]
In [34]: Foo._meta.many_to_many
Out [34]: []
是否会通过询问与[<django.db.models.fields.related.ManyToManyField: bars>]
模型的m2m关系返回Foo
?
答案 0 :(得分:1)
是的。以下内容将返回模型的RelatedObject
列表,该列表与多对多字段相反。
related_objects = Foo._meta.get_all_related_many_to_many_objects()
可以使用related_object.field
访问该字段。请注意,这仍然是 Bar
到 Foo
的字段,它与Bar._meta.many_to_many
返回的字段完全相同。
要获取指向或来自模型的所有多对多字段,您可以执行以下操作:
many_to_many = (Foo._meta.many_to_many
+ [r.field for r in Foo._meta.get_all_related_many_to_many_objects()])
答案 1 :(得分:0)
您可以在下面使用其获取Django模型的所有相关关系(反向)。使用related_objects
会将带有所有关系定义的可迭代对象返回到模型。可迭代表示所有关系(one-to-one
,one-to-many
,many-to-one
,many-to-many
)。
from django.db.models.fields.reverse_related import ManyToManyRel
from apps import models as app_models
def get_relations(obj):
main_model = obj._meta.model
counter = 0
for x in main_model._meta.related_objects:
counter += 1
relation = ''
if x.one_to_one:
relation = 'one-to-one'
elif x.one_to_many:
relation = 'one-to-many'
elif x.many_to_one:
relation = 'many-to-one'
elif x.many_to_many:
relation = 'many-to-many'
model = x.related_model
print "{}) Relation: {} {} {}".format(
counter, str(main_model._meta), relation, str(model._meta)
)
if isinstance(x, ManyToManyRel):
field_name = x.field.m2m_reverse_field_name()
query_set = x.through.objects.filter(**{field_name: obj})
else:
field_name = x.field.name
query_set = model.objects.filter(**{field_name: obj})
print "Count: {}".format(query_set.count())
print ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
obj = app_models.ModelName.objects.get(id=123)
get_relations(obj)
希望这会有所帮助!