property、getattr 的用法和Django Model 和 dict 的转换

28 篇文章 1 订阅
7 篇文章 0 订阅

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值