(usando Django 1.11)
Esta pregunta se ha vuelto confusa, porque el comportamiento informado no es el comportamiento moderno de un campo relacionado. Ejemplo aquí, donde JobTemplate
es la clase del modelo, y credentials
es una relación muchos-a-muchos campos relacionados:
>>> JobTemplate._meta.get_field('credentials').__class__
django.db.models.fields.related.ManyToManyField
¿Es diferente si inspeccionamos la _meta
de un objeto?
>>> JobTemplate.objects.first()._meta.get_field('credentials').__class__
django.db.models.fields.related.ManyToManyField
no.
Así que aquí es cuando inserto lo que creo que es el escenario más probable de alguien que viene aquí. Usted tiene esto:
>>> JobTemplate.objects.first().credentials
<django.db.models.fields.related_descriptors.ManyRelatedManager at 0x6f9b390>
Nota, esto es lo que tenía el OP.
Voy a estipular que el modelo relacionado es Credential
. ¡Puedo verificar si este es un administrador de credenciales relacionado!
>>> isinstance(JobTemplate.objects.first().credentials, Credential.objects.__class__)
True
campos ManyToMany pueden ser muy difíciles de procesar, porque el atributo mata a sí mismo y se reemplaza con la subclase gerente. También puede hacer una referencia cruzada de esta información con el campo obtenido de get_field('credentials')
para estar más seguro.La verificación anterior isinstance
también podría recoger erróneamente a otros administradores que haya establecido en el modelo. Sin embargo, esta sigue siendo una valiosa prueba para ver si el atributo que tiene "corta" la forma en que debe funcionar un campo ManyToMany de ese modelo particular relacionado.
Esta sería la manera perfecta, pero no sé cómo obtener la instancia de campo de un campo de muchos a muchos, que se encuentra en el modelo de destino ... si pudiera ayudarme con esto, accecpt su respuesta :) – amann
Puedo listar todos los campos con 'object._meta.get_all_field_names()' pero no se puede acceder al nombre de campo correspondiente a través de 'object._meta.get_field ('fieldname')'. Puedo usar la función 'object._meta.get_field_by_name ('fieldname')' que saca '(, None, False, True)'. En realidad, no sé cómo sacar la instancia de campo de eso ... –
amann
lo tengo :) ... es: 'object._meta.get_field_by_name (" fieldname ") [0] .field' – amann