我对django的内置 comments 模型进行了一个简单的查询,并通过heroku的postgreSQL数据库得到以下错误:

DatabaseError: operator does not exist: integer = text LINE 1: 
... INNER JOIN "django_comments" ON ("pi ns_pin"."id" = "django_...
                                                         ^
HINT:  No operator matches the given name and argument type(s). 
You might need to add explicit type casts.

在谷歌上搜索之后,这个错误似乎在django被解决过很多次,但我仍然能理解(所有相关问题都在3-5年前就解决了).我使用的是django 1.4版和最新版本的tastypie.

该查询是在orm过滤器下进行的,并与我的开发数据库(sqlite3)完美配合:

class MyResource(ModelResource):    

    comments = fields.ToManyField('my.api.api.CmntResource', 'comments', full=True, null=True)

    def build_filters(self, filters=None):
        if filters is None:
            filters = {}

        orm_filters = super(MyResource, self).build_filters(filters)

        if 'cmnts' in filters:
            orm_filters['comments__user__id__exact'] = filters['cmnts']

class CmntResource(ModelResource):
    user = fields.ToOneField('my.api.api.UserResource', 'user', full=True)
    site_id = fields.CharField(attribute = 'site_id')
    content_object = GenericForeignKeyField({
        My: MyResource,
    }, 'content_object')
    username = fields.CharField(attribute = 'user__username', null=True)
    user_id = fields.CharField(attribute = 'user__id', null=True)

有没有人有过在不编写原始SQL的情况下绕过这个错误的经验?

推荐答案

基于IMSoP的回答:当一个通用外键使用一个文本字段作为对象的id,而对象的id字段不是文本字段时,这是django的ORM层的一个限制.Django不想做任何假设,也不想将对象的id转换为它不是的东西.我发现了一篇关于这http://charlesleifer.com/blog/working-around-django-s-orm-to-do-interesting-things-with-gfks/的优秀文章.

这篇文章的作者查尔斯·莱弗(Charles Leifer)为受此影响的查询提出了一个非常酷的解决方案,它将在今后处理这个问题时非常有用.

或者,我设法让我的查询工作如下:

if 'cmnts' in filters:
    comments = Comment.objects.filter(user__id=filters['cmnts'], content_type__name = 'my',   site_id=settings.SITE_ID ).values_list('object_pk', flat=True)
    comments = [int(c) for c in comments]
    orm_filters['pk__in'] = comments

起初,我在寻找一种类似Charles所做的修改SQL的方法,但结果证明,我所要做的就是将查询分为两部分,并将str(id)转换为int(id).

Postgresql相关问答推荐

利用PostgreSQL查询中表的顺序来计算包含每次时间的时间范围

Postgresql我必须创建一个索引还是已经有一个索引了?

在SqlalChemy中转义动态CamelCase场

为什么在使用PostGIS时,英国郡的几何图形会出现在几内亚湾?

多克.波斯格雷斯.PgAdmin4

Jsonb[]字段中的PostgreSQL否定&q;-0.0

是否从表中 Select 值?巴什

为什么不能超过 10 个并发连接到 Postgres RDS 数据库

为什么在 PostgreSQL 中忽略查询超时?

Nodemon - 安装期间clean exit - waiting for changes before restart

Rails 重置所有 Postgres 序列?

如何使用字符串作为 PostgreSQL 咨询锁的键?

是否可以在 PostgreSQL 中部分刷新materialized视图?

SQLAlchemy 和多个进程的连接问题

从time without time zone和时区名称中获取time with time zone

在 PostgreSQL 中显示正在运行的查询的全文

Postgis 中 2 点之间的距离,单位为 4326 米

使用 Hibernate 查询:colon gets treated as parameter / escaping colon

postgresql 查询以显示用户的组

Android 的 JDBC 与 Web 服务