primary modelos python django django-models primary-key models

python - primary - Cómo puedo establecer dos claves principales de campo para mis modelos en django



get model django (3)

Actualmente, los modelos Django solo admiten una clave primaria de columna única. Si no especifica primary_key = True para el campo en su modelo, Django creará automáticamente una id columna como clave principal.

El atributo unique_together en la clase Meta es solo restricciones para sus datos.

Tengo un modelo como este:

class Hop(models.Model): migration = models.ForeignKey(''Migration'') host = models.ForeignKey(User, related_name=''host_set'')

Quiero migrar y alojar ambas claves juntas.


Implementaría esto de manera ligeramente diferente.

unique_together una clave primaria predeterminada (campo automático) y usaría la propiedad unique_together , unique_together

class Hop(models.Model): migration = models.ForeignKey(''Migration'') host = models.ForeignKey(User, related_name=''host_set'') class Meta: unique_together = (("migration", "host"),)

Actuaría como una columna de clave primaria "sustituta".

Si realmente desea crear una clave principal de varias columnas, mire esta aplicación


si debe usar django en la base de datos heredada, no puede modificar db_schema

hay un método alternativo (feo) para solucionar este problema

anula la función de guardar o eliminar modelos

utilizar instrucción sql sin formato para guardar o eliminar objeto

clase BaseModel (models.Model):

def get_max_length_unique_key(self): max_len_unique_key = [] for unique_key in self._meta.unique_together: if len(unique_key) > len(max_len_unique_key): max_len_unique_key = unique_key return max_len_unique_key def get_db_conn(self): db_cnn = DbManage(db_ip, db_port, DATABASES_USER, DATABASES_PASSWORD, self._meta.db_table) db_cnn.connect() return db_cnn def save(self, *args, **kwargs): self.delete() cnn, databasename = self.get_db_conn() update_tables = self._meta.db_table key_list = "" values_list = "" for field in self._meta.fields: key_list += "%s," % field.name values_list += "/'%s/'," % str(getattr(self, field.name)) key_list = key_list[:len(key_list) - 1] values_list = values_list[:len(values_list) - 1] sql = "insert into %s(%s) values(%s)" % (update_tables, key_list, values_list) logger.info("insert new record to %s" % databasename) cnn.excute_sql(sql) cnn.close() def delete(self, *args, **kwargs): cnn = self.get_db_conn() update_tables = self._meta.db_table sql = "delete from %s where " % update_tables for uk in self.get_max_length_unique_key(): sql += "%s=/'%s/' and " % (uk, getattr(self, uk)) sql = sql[:len(sql) - 4] logger.info("delete record from %s" % update_tables) cnn.excute_sql(sql) cnn.close() pass class Meta: abstract = True

clase ImageList (BaseModel):

field1 = models.CharField(primary_key=True, max_length=30) field2 = models.CharField(primary_key=True, max_length=30) field3 = models.CharField(primary_key=True, max_length=30) body = models.CharField(max_length=2000, blank=True, null=True) updated_on = models.DateTimeField(blank=True, null=True) class Meta: managed = True db_table = ''image_list'' unique_together = ((''field1'', ''field2'', ''field3''),)