10
votes

Comment vérifier le type de plusieurs à plusieurs champs de Django?

Comment pouvez-vous vérifier le type d'un terrain à plusieurs à plusieurs dans Django?

Je voulais le faire de cette façon: xxx

ceci ne " t Travailler, car la classe PlusieursRelatedManager est introuvable. Mais si je fais champ .__ classe __ la sortie est django.db.models.fields.db.models.fields.related.manyrelatedManager

Pourquoi est-ce que cela fait référence à une classe qui Ne semble pas exister et comment puis-je le faire fonctionner?

Merci beaucoup pour votre aide.


0 commentaires

4 Réponses :


18
votes

Vous devriez être capable de vérifier comme une chaîne.

field.__class__.__name__ == 'ManyRelatedManager'


1 commentaires

Merci pour la réponse rapide! Mais n'est-ce pas un petit peu dedynamique? En fait, je ne pense pas que la classe "MétéorélatedManager" sera jamais renommée, mais n'est-ce pas un peu négligé? Mais cependant, je pense que je vais utiliser cette réponse, car il est plus performant que celui de Lazerscience. Merci!



0
votes

Je ne suis pas tout à fait sûr de ce que vous essayez d'atteindre, mais je suppose que vous devriez mieux regarder l'attribut _meta ​​code> de votre modèle pour déterminer la classe de terrain! Décédez _meta.fields code> et _meta.many_to_many code>!

Vous pouvez faire quelque chose comme: p>

field_class = [f for f in yourmodel._meta.many_to_many if f.name=='yourfield'][0].__class__


0 commentaires

6
votes

Si vous avez déjà l'instance de champ, vous pouvez simplement faire:

>>> print fm
<class 'django.db.models.fields.related.ManyRelatedManager'>
>>> print fm.instance._meta.get_field_by_name('fieldnamehere')
(<django.db.models.fields.related.ForeignKey: fieldnamehere>, None, True, False)


3 commentaires

Ce serait la voie parfaite, mais je ne sais pas comment obtenir l'instance de terrain d'un domaine à plusieurs à plusieurs, située au modèle cible. Si vous pouviez m'aider avec cela, je ' ll accompt votre réponse :)


Je peux répertorier tous les champs avec objet._meta.get_all_field_names () mais le nom de terrain correspondant n'est pas accessible via objet._meta.get_field ("FieldName") . Je peux utiliser la fonction objet._metta.get_field__meta.get_field_by_name ('' FieldName ') qui met ( . En fait, je ne sais pas comment obtenir l'exemple de champ de cette ..


obtenu :) .. c'est: objet._meta.get_field_by_name ("Nom de terrain") [0] .field



1
votes

(Utilisation de Django 1.11)

Cette question est devenue déroutante, car le comportement signalé n'est pas le comportement moderne d'un domaine connexe. Exemple ici, où jobtemplate code> est la classe de modèle et Les informations d'identification code> est un champ associé à plusieurs à plusieurs: p> xxx pré>

Est-il différent si nous inspections le _méta ​​code> d'un objet? P> xxx pré>

no. P>

Voici quand j'insère Je pense que le scénario le plus probable de quelqu'un vient ici. Vous avez ceci: p> xxx pré>

note, c'est ce que l'OP avait. P>

Je stipule que le modèle associé est Critique code >. Je peux vérifier s'il s'agit d'un gestionnaire de créditifs associé! P>

>>> isinstance(JobTemplate.objects.first().credentials, Credential.objects.__class__)
True


0 commentaires