Django o similar para claves primarias compuestas

Estoy escribiendo una aplicación web para mi empresa de ingeniería (advertencia: soy un progtwigdor solo por afición) y estaba planeando usar Django hasta que llegara a este obstáculo. Los modelos que quiero usar naturalmente tienen claves primarias de varias columnas. Según http://code.djangoproject.com/ticket/373 , no puedo usar Django, al menos no una versión publicada. ¿Puede alguien ayudarme con una solución, ya sea a través de otro marco web (solo en Python, por favor) o sugiriendo cambios en el modelo para que funcione con las limitaciones de Django? Espero realmente lo último, ya que esperaba usar esto como una oportunidad para aprender Django.

Ejemplo: la tabla uno tiene part_number y part_revision como dos campos que deben comprender una clave principal. AP / N puede existir en múltiples revisiones, pero P / N + rev son únicas.

La tabla dos tiene part_number, part_revision y dimension_number como su clave principal. AP / N a una velocidad específica puede tener varias dimensiones, sin embargo, cada una es única. Además, en este caso, P / N + rev debe ser un ForeignKey de la Tabla uno.

Una solución alternativa es crear una clave sustituta (una columna de incremento automático) como la columna de clave principal y colocar un índice único en su clave compuesta de dominio.

Las claves externas se referirán a la columna de clave principal sustituta.

¿Por qué no agregar una clave primaria normal y luego especificar ese part_number y part_revision como unique_together ?

Esta es esencialmente la forma Djangoish (¿Djangonic?) De hacer lo que dijo Mitch Wheat.

Recomiendo encarecidamente el uso de una clave sustituta. No porque sea “Djangoesque”. Supongamos que utiliza una clave compuesta que incluye part_number. ¿Qué pasaría si algún tiempo después su empresa decide cambiar el formato (y, por lo tanto, los valores) de ese campo? ¿O en términos generales, algún campo? No querría tratar con cambiar las claves primarias. No sé qué beneficio se ve en el uso de una clave compuesta que consiste en valores “reales”, pero creo que no vale la pena la molestia. Use claves sin significado, autoincrementadas (y eso probablemente debería hacer que una clave compuesta sea inútil).

SQLAlchemy es compatible con claves primarias y externas compuestas, por lo que cualquier marco basado en SQLAlchemy (Pylons y Werkzeug viene a la mente) debe satisfacer sus necesidades. Pero la clave primaria sustituta es más fácil de usar y está mejor soportada de todos modos.

Si quieres solo campos mixtos únicos:

 class MyTable(models.Model): class Meta: unique_together = (('key1', 'key2'),) key1 = models.IntegerField() key2 = models.IntegerField() 

Pero si quiere que sean únicos juntos y uno de los de la columna sea el primario, pruebe el siguiente código similar:

 class MyTable(models.Model): class Meta: unique_together = (('key1', 'key2'),) key1 = models.IntegerField(primary_key=True) key2 = models.IntegerField()