Django-Modelle - ID statt Objekt zuweisen

9

Ich entschuldige mich, wenn meine Frage sich als albern herausstellt, aber ich bin ziemlich neu in Django, und ich konnte nirgendwo eine Antwort finden.

Ich habe das folgende Modell:

%Vor%

Wenn ich nun versuche, ein Objekt wie dieses zu erstellen:

%Vor%

Ich erhalte einen folgenden Fehler:

%Vor%

Natürlich, wenn ich es durch etwas wie das ersetzen:

%Vor%

alles funktioniert gut. Die Frage ist:

Trifft meine Lösung die Datenbank, um beide Benutzer abzurufen, und wenn ja, ist es möglich, sie zu vermeiden, indem Sie einfach IDs übergeben?

    
Marcin Kulus 01.10.2012, 22:54
quelle

2 Antworten

11

Die Antwort auf Ihre Frage lautet: JA.

Django wird die Datenbank (mindestens) dreimal (2) treffen, um die zwei Benutzerobjekte abzurufen, und eine dritte, um die gewünschten Informationen zu übermitteln. Dies wird zu einem unnötigen Overhead führen.

Versuch es einfach:

%Vor%

Dies ist das Standardnamenmuster für die von Django ORM generierten FK-Felder. Auf diese Weise können Sie die Informationen direkt festlegen und die Abfragen vermeiden.

Wenn Sie nach den bereits gespeicherten BlackListEntry-Objekten suchen möchten, können Sie die Attribute mit einem doppelten Unterstrich wie folgt navigieren:

%Vor%

So greifen Sie auf Eigenschaften in Django-Abfragesätzen zu. mit einem doppelten Unterstrich. Dann können Sie mit dem Wert des Attributs vergleichen.

Obwohl sie sehr ähnlich sind, arbeiten sie völlig anders. Der erste setzt ein Attribut direkt, während das zweite von django geparst wird, das es am '__' aufteilt und die Datenbank auf die richtige Weise abfragt, wobei der zweite Teil der Name eines Attributs ist.

Sie können user_banned und user_banning immer mit den tatsächlichen Benutzerobjekten anstelle ihrer IDs vergleichen. Aber das nützt nichts, wenn Sie diese Objekte nicht schon bei sich haben.

Ich hoffe, es hilft.

    
Francisco 01.10.2012, 23:10
quelle
0

Ich glaube, wenn Sie die Benutzer holen, wird es die db treffen ...

Um dies zu vermeiden, müssten Sie die root sql schreiben, um die Aktualisierung mit der hier beschriebenen Methode durchzuführen:

Ссылка

Wenn Sie sich für diese Route entscheiden, denken Sie daran, dass Sie dafür verantwortlich sind, sich vor SQL-Injection-Angriffen zu schützen.

Eine andere Alternative wäre, die Objekte user_banned und user_banning zwischenzuspeichern.

Es ist jedoch wahrscheinlich, dass das Ergreifen der Benutzer und das Erstellen des BlackListEntry keine merklichen Leistungsprobleme verursacht. Caching oder Ausführen von Raw SQL wird nur einen kleinen Vorteil bieten. Sie werden wahrscheinlich auf andere Probleme stoßen, bevor dies ein Problem wird.

    
Dave 01.10.2012 22:55
quelle

Tags und Links