Django _meta很多很多

时间:2014-07-22 18:25:40

标签: python django

我正在编写一个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

2 个答案:

答案 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-oneone-to-manymany-to-onemany-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)

希望这会有所帮助!