2012-03-30 6 views
3

ich mit einem Django-Modell arbeite, die wie folgt aussieht:Kann ich ein OneToOneField erstellen, das ein Objekt erstellt, wenn es nicht existiert?

class Subscription(models.Model): 
    user = models.OneToOneField(User) 

Das heißt, es hat eine Eins-zu-Eins-Verbindung mit der User Klasse von auth Moduls Django. Diese Zuordnung ist nicht optional. aber dank einigen Legacy-Code und einige manuellen Bastelei mit der Datenbank gibt es Fälle, in denen ein Nutzer nicht hat ein zugehöriges Abonnement, die diesen Code wie folgt heißt:

sub = user.subscription 

eine DoesNotExist Ausnahme auslösen . Viele der Codebasis gehen jedoch davon aus, dass jedem Benutzer ein Subscription Objekt zugeordnet ist.

Gibt es eine Weise, die ich Unterklasse könnte OneToOneField, so dass, wenn das zugehörige Subscription Objekt in der Datenbank nicht vorhanden ist, und ich habe schaffen und senden Sie es, wenn user.subscription genannt wird, anstatt eine Ausnahme zu werfen?

Antwort

1

Der richtige Weg, dies zu tun, ist das Signal post_save zu fangen, ein Objekt zu erstellen, wenn nötig.

+0

Dies vor allem für ältere geschieht (bestehende) 'Benutzer So wird ein 'post_save'-Signal nicht unbedingt vor der Dereferenzierung des zugehörigen Subskriptionsobjekts ausgelöst. – mipadi

+1

Eine einzelne Abfrage kann mit allen Legacy-Benutzern umgehen. –

0

hinzufügen eine Eigenschaft namens subscription und in getter notwendige Referenz erstellen, für die Sie Affe-Patchen können zu tun haben, bessere Alternativen sind

  1. Ihren Code Refactoring und eine Nutzenfunktion hinzufügen Abonnement erhalten
  2. Ihr Code Refactoring und proxy model für Benutzer
  3. einfach fixieren den db hinzufügen, sobald
Verwandte Themen