2010-02-19 2 views
7

Dans ce:Django unique_together sur le modèle de sous-classe pour l'attribut parent?

class Administrator(models.Model): 
    user = models.OneToOneField(User, primary_key=True) 
    account = models.ForeignKey(Account) 

    class Meta: 
     unique_together = (('account', 'self.user.username'),) 

La partie self.user.username est évidemment incorrrect. Cependant, dans ce:

class Administrator(User): 
    account = models.ForeignKey(Account) 

    class Meta: 
     unique_together = (('account', 'username'),) 

cela fonctionnerait-il puisque je hérite de l'utilisateur? (Je ne peux pas encore le tester car il y a trop d'éléments hors de propos ailleurs). Puis-je utiliser la première version avec 'user.username' à la place? Ou, devrais-je utiliser la deuxième version?

Répondre

7

Il serait

unique_together = (('account', 'user__username'),) 

si je comprends ce que vous essayez de faire. Notez le double trait de soulignement. C'est ainsi que vous regardez les propriétés de l'objet d'une clé étrangère.

+0

Ok, merci Tom. Cela fonctionne parfaitement. J'ai peur de sous-classer l'utilisateur (je ne sais pas quels effets pourraient en découler), donc je vais l'utiliser à la place. – orokusaki

+0

Pourquoi seriez-vous inquiet au sujet de l'utilisateur de sous-classe? Qu'essayez-vous de faire? Si vous essayez d'ajouter des informations supplémentaires au modèle utilisateur, regardez django-registration (http://bitbucket.org/ubernostrum/django-registration/). Sinon, je pense que vous voulez jeter un oeil au système d'authentification (http://docs.djangoproject.com/en/dev/topics/auth/), qui a déjà des utilisateurs et des admins et d'autres concepts de sécurité intégrés. – Tom

+0

m construire un SAAS afin que les utilisateurs ne soient pas le plus haut niveau d'instance dans mon logiciel. Les comptes vont. Cela signifie qu'un utilisateur peut être n'importe quel administrateur, client, etc. Chacun d'eux peut avoir ses propres autorisations (par exemple, un administrateur de compte peut modifier les paramètres de son compte (comme son identifiant PayPal ou insérer un CSS pour l'utiliser). pour leurs formulaires, etc, et un client d'un titulaire de compte sera en mesure de se connecter et d'envoyer des messages au titulaire du compte et le titulaire du compte leur répondra (conversations privées)) Cela semble OK, ou suis-je toujours manquant – orokusaki

5

Je ne crois pas que vous puissiez faire ce que vous essayez de faire en utilisant le noyau django. Comme indiqué in this answer to a related question unique_together est appliquée à la couche DB. Si vous inspectez les tables de base de données créées par l'héritage de modèle django, vous verrez que cela n'est pas possible pour la base de données.

Jetez un oeil à cette question connexe pour quelques solutions alternatives.

Questions connexes