python怎样进行主键合并_python-如何在Django中为我的模型设置两个主键字段

该博客介绍了在Django模型中如何处理具有多个主键字段的情况,特别是在不能修改db_schema的旧版数据库上。通过覆盖模型的`save`和`delete`方法,使用原始SQL语句来实现对象的保存和删除操作,确保主键合并的正确性。
摘要由CSDN通过智能技术生成

如果您应该在旧版数据库上使用django,则无法修改db_schema

有一种解决方法(丑陋的)方法可以解决此问题

覆盖模型的保存或删除功能

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值