加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

heroku,postgreSQL,django,comments,tastypie:没有操作符匹配给

发布时间:2020-12-13 16:26:44 所属栏目:百科 来源:网络整理
导读:我有一个简单的查询 django的内置的评论模型,并得到以下的错误与heroku的postgreSQL数据库: DatabaseError: operator does not exist: integer = text LINE 1: ... INNER JOIN "django_comments" ON ("pi ns_pin"."id" = "django_... ^HINT: No operator ma
我有一个简单的查询 django的内置的评论模型,并得到以下的错误与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?

PostgreSQL是“强类型” – 也就是说,每个查询中的每个值都具有明确定义的特定类型(例如,表中列的类型)或隐式(例如,输入到WHERE子句的值).所有函数和运算符(包括=)都必须被定义为接受特定类型 – 所以例如有一个VarChar = VarChar的运算符,另外一个用于int = int.

在您的情况下,您有一个明确定义为int类型的列,但是您将其与PostgreSQL解释为类型文本的值进行比较.

另一方面,SQLite是“弱类型” – 值被自由地视为最适合正在执行的动作的任何类型的值.所以在你的开发SQLite数据库中,操作’42’= 42可以计算得很好,其中PostgreSQL需要VarChar = int的特定定义(或text = int,文本是PostgreSQL中的无界字符串的类型).

现在,PostgreSQL有时会有所帮助,并自动地“转换”你的值,使这些类型与一个已知的运算符匹配,但是更多的时候,正如提示所说,你需要明确地做.如果你自己编写SQL,那么显式类型的情况可能看起来像WHERE id = CAST(’42’AS INT)(或者WHERE CAST(id AS text)=’42’).

既然你不是,你需要确保你给查询生成器的输入是一个实际的整数,而不仅仅是一个字符串,它恰好包含数字.我怀疑这是一样简单的使用fields.IntegerField而不是fields.CharField,但我实际上并不知道Django,甚至Python,所以我想我会给你的背景,希望你可以从那里拿走.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读