2010-06-30 7 views
0

J'ai un modèle:Y at-il quelque chose comme unique_together (max_occurences = 3)?

class MyModel(models.Model): 
    a = models.IntegerField() 
    b = models.IntegerField() 
    c = models.IntegerField() 

Maintenant, je besoin de quelque chose comme unique_together(a,b, max_occurences=3) contrainte à ajouter au modèle ci-dessus (pour qu'il puisse y avoir jusqu'à 3 valeurs de c pour chaque paire de (a, b) , et idéalement ces 3 valeurs de c devraient être aussi uniques pour donné (a, b)), mais je ne sais pas quoi chercher (et si quelque chose comme ça existe même dans MySQL). Y at-il quelque chose comme ça, ou je dois faire quelque chose comme ceci:

class MyModel(models.Model): 
    a = models.IntegerField() 
    b = models.IntegerField() 

    c1 = models.IntegerField() 
    c2 = models.IntegerField() 
    c3 = models.IntegerField() 

    class Meta: 
     unique_together = ('a', 'b') 

- et gérer c1..c3 moi-même?

+0

Vous devriez mieux modéliser vos données. –

+0

Je le considère - et maintenant? –

Répondre

0

Vous devez remplacer la méthode save() pour le modèle et vérifier votre contrainte avant chaque sauvegarde et déclencher une erreur ValueError si la contrainte est violée.

class MyModel(models.Model): 
    a = models.IntegerField() 
    b = models.IntegerField() 
    c = models.IntegerField() 

    def save(self): 
     try: 
      # Check values in model here 
     except: 
      raise ValueError("Cannot save more than 3 Cs with an A") 
     super(MyModel, self).save(*args, **kwargs) 
+0

Oui, mais c'est fragile - un pirate pourrait tirer, par exemple. 20 requêtes simultanées et booster ses statistiques au dessus du niveau autorisé. Je préférerais une solution solide de côté db, s'il y en a. –

+0

La seule chose que je pourrais penser serait quelque chose fait dans la base de données elle-même alors. Vous devriez fermer cette question et en ouvrir une nouvelle dans PostgreSQL ou MySQL avec la version SQL de ce modèle. Vous devrez le maintenir séparément et il ne sera pas portable. Quoiqu'il en soit, 20 requêtes simultanées ne permettraient pas à un utilisateur d'aller au-delà de la méthode save(). –

+0

Ok, merci! –