Ya no tienes que indagar más en otras webs porque llegaste al sitio justo, poseemos la respuesta que deseas pero sin complicaciones.
Solución:
Implementaría esto de manera ligeramente diferente.
Yo usaría un primario predeterminado key (campo automático) y use la propiedad de metaclase, 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 un primario “sustituto” key columna.
Si realmente desea crear un principal de varias columnas keybusca en esta aplicación
Actualmente, los modelos de Django solo admiten un primario de una sola columna. key. Si no especificas primary_key = True
para el campo en su modelo, Django creará automáticamente una columna id
como primario key.
Él attribute unique_together
en la clase Meta
es solo una restricción para sus datos.
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
anular los modelos guardan o eliminan la función
# use raw sql statement to save or delete object
class 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
class 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'),)
Calificaciones y reseñas
No se te olvide dar visibilidad a este artículo si te fue de ayuda.