django-contenttypes - 列出模型的所有通用关系

时间:2012-05-22 13:32:25

标签: python django django-contenttypes

我想反思一个模型并列出其所有后向泛型关系。

我的模型看起来像这样:

class Service(models.Model):
    host = models.ForeignKey(Host)

    statuses = generic.GenericRelation(Status)

Status对象如下所示:

class Status(TrackedModel):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

    class Meta:
        verbose_name_plural = 'statuses'

我想以编程方式了解statuses是服务模型的通用关系。这可能吗? Status._meta.fields不会显示statusesStatus._meta.get_all_field_names()会显示,只显示其他不需要的内容。

我认为这可能是一种可能的解决方案,但对我来说这似乎很麻烦。我很想听到一个更好的。

from django.db.models.fields import FieldDoesNotExist
from django.contrib.contenttypes import generic

generic_relations = []
for field_name in Service._meta.get_all_field_names():
    try:
        field = Service._meta.get_field(field_name)
    except FieldDoesNotExist:
        continue

    if isinstance(field, generic.GenericRelation):
        generic_relations.append(field)

谢谢!

1 个答案:

答案 0 :(得分:3)

GenericRelationManyToManyField的工作方式类似。您可以在Service._meta.many_to_many中找到它:

filter(lambda f:isinstance(f, generic.GenericRelation), Service._meta.many_to_many)