1. 对于可能需要经常访问的对象属性,可以借鉴下面的 getattr 的用法
class TransRule(models.Model):
@property
def rule_db(self):
if not getattr(self, 'rule_dbinfo', None):
print '------get the info from the DB------'
database = self.src_table.database
if database.db_type == 1:
self.rule_dbinfo = '{0}:{1}/{2}'.format(database.db_host, database.db_port, database.db_name)
else:
self.rule_dbinfo = database.cluster_name
return self.rule_dbinfo
rule = TransRule.objects.filter(id = 43).first()
print rule.rule_db
# 发现第二次调用 rule.rule_db 时,不再和 DB 交互了
print '-----------------'
print rule.rule_db
# The output:
INFO 2020-04-30 17:57:34,465 4024 140141830076160 tests 75 Line In the test
DEBUG 2020-04-30 17:57:34,480 4024 140141830076160 utils 90 Line (0.000) SELECT @@SQL_AUTO_IS_NULL; args=None
DEBUG 2020-04-30 17:57:34,486 4024 140141830076160 utils 90 Line (0.001) SELECT VERSION(); args=None
DEBUG 2020-04-30 17:57:34,512 4024 140141830076160 utils 90 Line (0.001) SELECT `auth_user`.`id`, `auth_user`.`password`, `auth_user`.`last_login`, `auth_user`.`is_superuser`, `auth_user`.`username`, `auth_user`.`first_name`, `auth_user`.`last_name`, `auth_user`.`email`, `auth_user`.`is_staff`, `auth_user`.`is_active`, `auth_user`.`date_joined` FROM `auth_user` WHERE `auth_user`.`id` = 1; args=(1,)
DEBUG 2020-04-30 17:57:34,517 4024 140141830076160 utils 90 Line (0.002) SELECT `trans_rule`.`id`, `trans_rule`.`name`, `trans_rule`.`description`, `trans_rule`.`src_table_id`, `trans_rule`.`where_clause`, `trans_rule`.`split_column_name`, `trans_rule`.`split_column_operator`, `trans_rule`.`split_column_value`, `trans_rule`.`split_column_type`, `trans_rule`.`rule_type`, `trans_rule`.`rule_hash`, `trans_rule`.`parallel_degree`, `trans_rule`.`delimiter`, `trans_rule`.`trans_row`, `trans_rule`.`delete_row`, `trans_rule`.`rule_status`, `trans_rule`.`is_splitting`, `trans_rule`.`create_user_id`, `trans_rule`.`create_datetime`, `trans_rule`.`update_datetime` FROM `trans_rule` WHERE `trans_rule`.`id` = 43 ORDER BY `trans_rule`.`id` ASC LIMIT 1; args=(43,)
------get the info from the DB------
DEBUG 2020-04-30 17:57:34,568 4024 140141830076160 utils 90 Line (0.046) SELECT `table_info`.`id`, `table_info`.`name`, `table_info`.`database_id`, `table_info`.`create_datetime`, `table_info`.`update_datetime` FROM `table_info` WHERE `table_info`.`id` = 33; args=(33,)
DEBUG 2020-04-30 17:57:34,571 4024 140141830076160 utils 90 Line (0.002) SELECT `database_info`.`id`, `database_info`.`db_type`, `database_info`.`cluster_name`, `database_info`.`db_host`, `database_info`.`db_port`, `database_info`.`db_name`, `database_info`.`src_or_dest`, `database_info`.`group_id`, `database_info`.`create_user_id`, `database_info`.`create_datetime`, `database_info`.`update_datetime` FROM `database_info` WHERE `database_info`.`id` = 117; args=(117,)
192.168.56.1:3306/archiver_src
-----------------
192.168.56.1:3306/archiver_src
[30/Apr/2020 17:57:34] "GET /api/v1/db_operator/test/ HTTP/1.1" 200 5
2. Django Model 和 dict 的联系:
def test(request):
logger.info('In the test')
user = User.objects.get(id=1)
rule = TransRule.objects.filter(id = 43).first()
print type(rule)
tmp = rule.__dict__
tmp['description'] = 'test'
rule.save()