2010-12-14 18 views
41

que tienen una situación en la que quiero usar las opciones Meta de unique_together para hacer cumplir una norma determinada, aquí está el modelo intermediario:Django único Juntos (con claves externas)

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

y aquí está PerfilUsuario:

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

Gracias.

Respuesta

8

Mi solución fue usar Django get_or_create. Al usar get_or_create, se producirá un get inútil si la fila ya existe en la base de datos, y la fila se creará si no existe.

Ejemplo:


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

Sólo tenga cuidado. Esto puede fallar si está usando transacciones (que probablemente sea). – mlissner

Cuestiones relacionadas