【问题标题】:Django queryset not escaping text in a where...in queryDjango 查询集没有在 where...in 查询中转义文本
【发布时间】:2012-12-27 07:24:15
【问题描述】:

我正在尝试构建一个相当简单的查询集,它根据相关表中的一组条件返回值列表。根据 URL 参数中的值,将一组值传递给查询集上的 in 过滤器。

问题是 Django 将这些值作为文本不带引号传递到 SQL 查询中,因此查询失败。

焦点表包含有关公司(“实体”)的信息以及有关这些公司办公室(“办公室”)的相关表信息。

这是传递给查询集的值数组:

locations = [u'San Francisco', u'New York']

这是查询:

companies = Entity.objects.values("name","summary").filter(office__city__in=locations)

这是实际命中 SQL 的查询:

SELECT "entities_entity"."name", "entities_entity"."summary" FROM "entities_entity" INNER JOIN "entities_office" ON ("entities_entity"."id" = "entities_office"."entity_id") WHERE "entities_office"."city" IN (San Francisco, New York)

如果我手动运行 SQL 查询,但将 IN 子句中的每个语句用单引号(而不是双引号)括起来,它就可以正常工作。

关于为什么会发生这种情况以及如何解决它的任何想法?

对于它的价值,这里是模型的相关部分

class Entity(models.Model):
    name = models.CharField(max_length=450)
    summary = models.TextField(blank=True,null=True)

class Office(models.Model):
    entity = models.ForeignKey(Entity)
    city = models.CharField(max_length=250,blank=True,null=True)

【问题讨论】:

  • 您遇到什么错误?你是如何检查 SQL 的? django.db.connection.queries 不包含转义参数,仅用于调试。
  • 啊,我根据companies.queries 仔细检查了PGAdmin 中的查询——也许我的数据有问题...

标签: django postgresql django-queryset postgresql-9.1


【解决方案1】:

当 Django 替换内容以应用查询过滤器时,这似乎是一种奇怪的行为。

也许值得一试:

locations = [u'\'旧金山\'', u'\'纽约\'']

【讨论】:

    【解决方案2】:

    不幸的是,这是 Django 查询集 query 属性的 known 限制。 Django 开发人员仅提供用于调试,并且拒绝对其进行修改以反映实际的数据库后端,因此它不会正确地正确转义某些数据类型。

    【讨论】:

      猜你喜欢
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多