2013-08-27 2 views
0

Je crée un site Web sur les services fournis par certains professionnels. Chaque professionnel crée sa propre page personnelle et répertorie les services qu'il fournit, avec des prix. Cependant, il dispose d'un certain choix limité de types de services parmi lesquels choisir. Le professionnel ne peut pas créer de nouveaux types de services - c'est la prérogative de l'administrateur. Chaque service que les listes professionnelles doivent être d'un certain type prédéterminé, et il ne peut pas avoir des services du même type.Quelle est la meilleure façon de créer des modèles pour cette situation dans django?

Jusqu'à présent, c'est ce que j'ai dans models.py:

# Created and edited only by site administration 
class Service(models.Model): 
    url_name = models.CharField(max_length=100, primary_key=True) # to use in URLs 
    name = models.CharField(max_length=200) 
    description = models.TextField() 

    def __unicode__(self): 
     return self.name 

class Master(models.Model): 
    name = models.CharField(max_length=200) 
    description = models.TextField() 

    def __unicode__(self): 
     return self.name 

class MasterService(models.Model): 
    master = models.ForeignKey(Master) 
    service = models.ForeignKey(Service) 
    price = models.PositiveIntegerField(blank=True) 

Comment puis-je modifier ce modèle de telle sorte que le django « saura » que chaque maître ne peut avoir 1 service d'une certain type de service?

+0

Je pense que c'est ce que vous cherchez: http://stackoverflow.com/questions/232435/how-do-i-restrict-foreign-keys-choices-to-related-objects-only-in- django – Paul

Répondre

1

Essayez unique_together.

class MasterService(models.Model): 
    master = models.ForeignKey(Master) 
    service = models.ForeignKey(Service) 
    price = models.PositiveIntegerField(blank=True) 

    class Meta: 
     unique_together = ('master', 'service') 

Cette contrainte sera appliquée au niveau de la base de données, donc il ne sera pas possible d'associer un service avec un master plus d'une fois. Voir le docs.

+0

Merci. C'est exactement ce que j'avais en tête. –

Questions connexes