Überprüfen Sie, ob in Django ein Modellfeld existiert

8

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?

    
lucaswxp 13.03.2015, 14:24
quelle

5 Antworten

5

hasattr (cls, field) wird nicht immer funktionieren, zum Beispiel wenn Mixins verwendet werden. Ein sicherer Test ist:

%Vor%

oder

%Vor%     
PhoebeB 08.09.2016 10:45
quelle
2

Sie können getattr verwenden, um einen Standardwert zurückzugeben, wenn das Feld nicht existiert .. wie unten

%Vor%     
AceLearn 08.09.2016 10:49
quelle
2

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).

    
RemcoGerlich 08.09.2016 10:54
quelle
2
  

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:

%Vor%

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.

    
AlanSE 30.01.2017 13:56
quelle
1

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:

%Vor%

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?

    
Ivanhoe 23.06.2015 17:22
quelle

Tags und Links