Pergunta

Gostaria de refletir sobre um modelo e listar todas as suas relações genéricas retrógradas.

Meu modelo fica assim:

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

    statuses = generic.GenericRelation(Status)

O objeto Status se parece com isto:

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

    class Meta:
        verbose_name_plural = 'statuses'

Eu gostaria de aprender isso programaticamente statuses é uma relação genérica para o modelo de serviço.Isso é possível? Status._meta.fields Não mostra statuses, mas Status._meta.get_all_field_names() faz, só que mostra outras coisas indesejadas também.

Achei que essa poderia ser uma solução possível, mas me parece muito confuso.Eu adoraria ouvir falar de um melhor.

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)

Obrigado!

Foi útil?

Solução

O GenericRelation funciona de forma semelhante a ManyToManyField.Você poderia encontrá-lo em Service._meta.many_to_many:

filter(lambda f:isinstance(f, generic.GenericRelation), Service._meta.many_to_many)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top