Django Custom clave primaria

Cuando inspecciono la base de datos Trac obtengo:

class TicketChange(models.Model): ticket = models.IntegerField() time = models.BigIntegerField() author = models.TextField(blank=True) field = models.TextField() oldvalue = models.TextField(blank=True) newvalue = models.TextField(blank=True) class Meta: managed = False db_table = 'ticket_change' 

Con clave no primaria:

 >>> TicketChange.objects.all() DatabaseError: column ticket_change.id does not exist LINE 1: SELECT "ticket_change"."id", "ticket_change"."ticket", "tick... 

Porque necesito especificar un pk pero la clave primaria original de ticket_change en Trac es:

 Primary key (ticket, time, field) 

Pero no es posible en Django: Django Multi-Column Primary Key Discussion .

Si defino el time como pk, no puedo agregar dos cambios de tickets al mismo tiempo.

    ¿Que puedo hacer?

    Tienes razón. Es un problema conocido. Así que las únicas soluciones son hacks (tipo de).

    Su mejor opción es usar django-compositepks . Los inconvenientes son que realmente no admite relaciones de modelo, por lo que no podrá navegar a ninguna relación desde su modelo pk compuesto. Sin embargo, mirando su modelo de TicketChange esto no parece ser un problema (a menos que tenga más modelos con relaciones con este).

    Otra opción sería agregar manualmente la columna de identificación (y asegurarse de aplicar cualquier cambio adicional a la base de datos), creando así la nueva clave principal de una columna. Una tercera opción (y lo que probablemente haría), bastante similar a la anterior pero más limpia, sería crear una nueva base de datos desde cero y luego rellenarla con una secuencia de comandos al obtener los datos de su base de datos heredada existente.

    Lo siento, no tengo ninguna solución mejor para ti, así es como es. Legacy dbs y django son siempre un dolor de cabeza, he pasado por procesos similares a mí mismo. ¡Espero que esto ayude!

    Este es un caso de uso que Django ORM simplemente no admite. Si puede modificar el esquema de la base de datos, agregue una columna adicional que servirá como la clave principal para Django: un campo entero con AUTO_INCREMENT (MySQL) o SERIAL (PostgreSQL). No debe desestabilizar sus otras aplicaciones utilizando la tabla, ya que la base de datos la administrará cuando se inserten nuevos registros. Puede seguir utilizando la clave principal real al realizar consultas a través del ORM:

     ticket_change = TicketChange.objects.get(ticket=1234, time=5678, field='myfield')