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''),)