2010-02-19 7 views
7

En este:Django unique_together en el modelo de subclase para el atributo primario?

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

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

La parte self.user.username es, obviamente, incorrrect. Sin embargo, en esto:

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

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

¿funcionaría eso porque estoy heredando del usuario? (No puedo probarlo todavía porque hay demasiados elementos fuera de lugar en otro lugar). ¿Puedo usar la primera versión con 'user.username' en su lugar? O, ¿debería usar la segunda versión?

Respuesta

7

Sería

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

si entiendo lo que estás tratando de hacer. Tenga en cuenta el guion bajo doble. Así es como se observan las propiedades del objeto de una clave foránea.

+0

Ok, gracias Tom. Eso funciona perfectamente. Tengo miedo de subclasificar al usuario (no sé qué efectos podrían venir en el camino de esto), así que lo usaré en su lugar. – orokusaki

+0

¿Por qué le preocuparía subclasificar al usuario? ¿Que estás tratando de hacer? Si intenta agregar información adicional al modelo de usuario, consulte django-registration (http://bitbucket.org/ubernostrum/django-registration/). De lo contrario, creo que desea echar un vistazo al sistema de autenticación (http://docs.djangoproject.com/en/dev/topics/auth/), que ya tiene incorporados usuarios y administradores y otros conceptos de seguridad. – Tom

+0

I ' m construyendo un SAAS para que los usuarios no sean el nivel más alto de instancia en mi software. Las cuentas lo harán Esto significa que un Usuario puede ser cualquier cosa desde un Administrador hasta un Cliente de titular de cuenta, etc. Cada uno puede tener sus propios permisos (es decir, un Administrador de Cuenta podrá editar la configuración de su cuenta (como su inicio de sesión de PayPal, o insertar CSS para usar) para sus formularios, etc., y un cliente de un titular de la cuenta podrá iniciar sesión y enviar mensajes al titular de la cuenta y el titular de la cuenta responderá a ellos (conversaciones privadas). ¿Suena bien, o sigo desaparecido? algo. – orokusaki

5

No creo que pueda hacer lo que intenta hacer con django core. Como se señaló in this answer to a related question unique_together se aplica en la capa DB. Si inspecciona las tablas de base de datos creadas por herencia de modelo de django, verá que esto no es posible para el DB.

Eche un vistazo a esa pregunta relacionada para encontrar algunas soluciones alternativas.

Cuestiones relacionadas