2010-12-14 32 views
41

J'ai une situation où je veux utiliser les options Meta de unique_together pour faire respecter une certaine règle, voici le modèle intermédiaire:Django unique Ensemble (avec les clés étrangères)

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

et est ici UserProfile:

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

Merci.

Répondre

8

Ma solution était d'utiliser Django get_or_create. En utilisant get_or_create, un get inutile se produira si la ligne existe déjà dans la base de données, et la ligne sera créée si elle n'existe pas.

Exemple:


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

Faites juste attention. Cela peut échouer si vous utilisez des transactions (ce que vous êtes probablement). – mlissner