使用Django的ORM模型插入数据时内联选择

时间:2013-10-04 21:06:54

标签: python django django-models sql-insert

我目前正在尝试优化以下代码,这些代码在我当前的项目中非常频繁地调用

Hit(link     = self.link,
    ip       = self.request.META['REMOTE_ADDR'],
    referrer = self.request.META['HTTP_REFERER'],
    country  = Country.objects.filter(shorthand=country_code).get()
).save()

生成以下SQL查询(SQLite后端,用于测试目的):

SELECT * FROM "ucp_country" WHERE "ucp_country"."shorthand" = 'DE';
INSERT INTO "ucp_hit" ("link_id", "ip", "referrer", "country_id")
VALUES (1, '127.0.0.1', 'http://127.0.0.1:8000/ucp/manage_links', 83);

其中DE是国家/地区代码,83是ID,由SELECT查询返回。

有没有办法告诉Django将查询合并为一个?我知道在传递未知国家/地区代码时发生的异常,发布的代码仅用于解释问题的目的。我想的是:

INSERT INTO "ucp_hit" ("link_id", "ip", "referrer", "country_id")
VALUES (1, '127.0.0.1', 'http://127.0.0.1:8000/ucp/manage_links',
        (SELECT "id" FROM "ucp_country" WHERE "ucp_country"."shorthand" = 'DE'));

如果找不到请求的国家/地区,则该查询应该插入NULL。是否有可能告诉Django以某种方式生成这样的查询?

1 个答案:

答案 0 :(得分:0)

我建议使用国家/地区ISO代码作为国家/地区的主要密钥,您可以use foreign key values directly

Hit(link     = self.link,
    ip       = self.request.META['REMOTE_ADDR'],
    referrer = self.request.META['HTTP_REFERER'],
    country_id  = country_code
).save()

这样您就可以免费获得额外的查询