Das ist die Lösung, die ich in meinem models.py gefunden habe:
%Vor%Und benutze es wie:
%Vor%Das Problem kommt mit fremden Schlüsseln, mein Post-Modell gehört zu einer Kategorie, dieser Check funktioniert:
%Vor%Aber das ist nicht:
%Vor%Dies ist der tatsächliche Feldname in db und ich muss es so überprüfen. Wie kann ich es im Django machen?
Ihr Feld 'category_id' ist ein verstecktes Feld in der Terminologie von Ссылка . Es kann nicht von get_field abgerufen werden.
Vielleicht Schleife über alle Felder und überprüfen Sie ihre Namen; get_fields kann versteckte Felder zurückgeben:
%Vor%Wenn Sie sich um Felder kümmern müssen, deren db_column von ihrem Standard geändert wurde, können Sie auch field.db_column testen (aber es ist nicht gesetzt, wenn es nicht explizit festgelegt wurde).
Aber das ist nicht:
Post.field_exists ('category_id') # & gt; Falsch
Dies ist der tatsächliche Feldname in db und ich muss es so überprüfen. Wie kann ich es im Django machen?
Der Fall für alles außer dem _id
-Teil wird in der anderen Antwort ausreichend beantwortet. Für die Behandlung der _id-Fälle benötigen Sie zusätzlich zu eine spezielle bedingte , die diese Fälle angemessen behandelt. Etwas Ähnliches:
Die zusätzliche Überprüfung ist erforderlich, um sicherzustellen, dass das Feld minus _id
einen ForeignKey zurückgibt, im Gegensatz zu einem anderen Feldtyp, der zufälligerweise denselben Namen trägt, was bedeuten würde, dass das name_id
-Feld im Modell ist ungültig.
Warum brauchen Sie das? Die Idee von Object Relational Mappers besteht darin, dass die Klassen die Datenbank beschreiben / definieren. Wenn Sie also den Typ eines Modells testen möchten, sollten Sie isinstance
wie folgt verwenden:
Ihre Modelldefinitionen definieren Ihr Schema. Es sollte keinen Grund geben, auf die Existenz eines Feldes zu testen. Wenn dies der Fall ist, folgen Sie möglicherweise nicht der Best Practice, indem Sie Felder mit setattr
zuweisen?