2010-12-14 14 views
41

Ho una situazione in cui voglio usare le opzioni di Meta di unique_together di far rispettare una certa regola, ecco il modello di intermediazione:Django unico insieme (con chiavi esterne)

class UserProfileExtension(models.Model): 
    extension = models.ForeignKey(Extension, unique=False) 
    userprofile = models.ForeignKey(UserProfile, unique=False) 
    user = models.ForeignKey(User, unique=False) 

    class Meta: 
     unique_together = (("userprofile", "extension"), 
          ("user", "extension"), 
          # How can I enforce UserProfile's Client 
          # and Extension to be unique? This obviously 
          # doesn't work, but is this idea possible without 
          # creating another FK in my intermediary model 
          ("userprofile__client", "extension")) 

ed ecco ProfiloUtente:

class UserProfile(models.Model): 
    user = models.ForeignKey(User, unique=True) 
    client = models.ForeignKey(Client) 

Grazie.

risposta

8

La mia soluzione era quella di utilizzare Django di get_or_create. Usando get_or_create, un get inutile si verifica se la riga esiste già nel database e la riga verrà creata se non esiste.

Esempio:


extension = Extension.objects.get(pk=someExtensionPK)
userProfile = UserProfile.objects.get(pk=someUserProfilePK)
UserProfileExtension.objects.get_or_create(extension=extension, userprofile=userProfile)
+0

Basta stare attenti. Questo può fallire se stai usando le transazioni (che probabilmente sei). – mlissner

Problemi correlati