【发布时间】:2015-12-30 06:57:04
【问题描述】:
我想根据模型的最后一个 id 在 Django 模型中插入一行。我的查询是这样的,
Order.objects.create(group=123131, identifier=friendly_invoice.encode(Order.objects.last().id))
# group and identifier are unique together
我记录了http://www.dabapps.com/blog/logging-sql-queries-django-13/中所示的查询,
(0.016) SELECT `order`.`id`, `order`.`group`, `order`.`identifier`, `order`.`created`, `order`.`modified` FROM `order` ORDER BY `order`.`id` DESC LIMIT 1; args=()
DEBUG 2015-12-30 12:16:21,881 (0.016) SELECT `order`.`id`, `order`.`group`, `order`.`identifier`, `order`.`created`, `order`.`modified` FROM `order` ORDER BY `order`.`id` DESC LIMIT 1; args=()
DEBUG 2015-12-30 12:16:21,881 (0.016) SELECT `order`.`id`, `order`.`group`, `order`.`identifier`, `order`.`created`, `order`.`modified` FROM `order` ORDER BY `order`.`id` DESC LIMIT 1; args=()
(0.000) INSERT INTO `order` (`group`, `identifier`, `created`, `modified`) VALUES ('123131', '378ETGY', '2015-12-30 06:46:21', '2015-12-30 06:46:21'); args=[u'123131', '378ETGY', u'2015-12-30 06:46:21', u'2015-12-30 06:46:21']
DEBUG 2015-12-30 12:16:21,881 (0.000) INSERT INTO `order` (`group`, `identifier`, `created`, `modified`) VALUES ('123131', '378ETGY', '2015-12-30 06:46:21', '2015-12-30 06:46:21'); args=[u'123131', '378ETGY', u'2015-12-30 06:46:21', u'2015-12-30 06:46:21']
DEBUG 2015-12-30 12:16:21,881 (0.000) INSERT INTO `order` (`group`, `identifier`, `created`, `modified`) VALUES ('123131', '378ETGY', '2015-12-30 06:46:21', '2015-12-30 06:46:21'); args=[u'123131', '378ETGY', u'2015-12-30 06:46:21', u'2015-12-30 06:46:21']
这是在 db 中创建两个 sql 查询。如果这段代码由两个并行请求执行,我相信这会出错。
如何以更安全的方式编写此查询?
【问题讨论】:
-
我想我们需要更多关于
friendly_invoice的信息。 -
这是一个将 id 加密为字母数字值的函数。它对用户隐藏 id 并向他/她显示一个字母数字字符串。
-
每次必须进行查询时,您是否进行解码和编码?我觉得这里有一个更大的问题。
-
没有。它仅用于显示用户。内部 id 无处不在。