heroku、postgreSQL、django、comments、tastypie:没有运算符匹配给定的名称和参数类型.您可能需要添加显式类型转换 [英] heroku, postgreSQL, django, comments, tastypie: No operator matches the given name and argument type(s). You might need to add explicit type casts

查看:23
本文介绍了heroku、postgreSQL、django、comments、tastypie:没有运算符匹配给定的名称和参数类型.您可能需要添加显式类型转换的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对 django 的内置评论模型有一个简单的查询,并使用 heroku 的 postgreSQL 数据库得到以下错误:

I have a simple query on django's built in comments model and getting the error below with heroku's postgreSQL database:

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.

After googling around it seems this error has been addressed many times before in django, but I'm still getting it (all related issues were closed 3-5 years ago) . I am using django version 1.4 and the latest build of tastypie.

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

The query is made under orm filters and works perfectly with my development database (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 的情况下解决此错误的经验?

Anybody have any experience with getting around this error without writing raw SQL?

推荐答案

Building on IMSoP's answer: 当通用外键为 object_id 使用文本字段并且对象的 id 字段不是一个文本域.Django 不想做任何假设或将对象的 id 转换为它不是的东西.我发现了一篇关于这个的优秀文章 http://charlesleifer.com/blog/working-around-django-s-orm-to-do-interesting-things-with-gfks/.

Building on IMSoP's answer: This is a limitation of django's ORM layer when a Generic foreign key uses a text field for the object_id and the object's id field is not a text field. Django does not want to make any assumptions or cast the object's id as something it's not. I found an excellent article on this http://charlesleifer.com/blog/working-around-django-s-orm-to-do-interesting-things-with-gfks/.

这篇文章的作者 Charles Leifer 为受此影响的查询提出了一个非常酷的解决方案,并将在处理这个问题时非常有用.

The author of the article, Charles Leifer came up with a very cool solution for query's that are affected by this and will be very useful in dealing with this issue moving forward.

或者,我设法使我的查询按如下方式工作:

Alternatively, i managed to get my query to work as follows:

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) 的.

Originally i was searching for a way to modify the SQL similar to what Charles has done, but it turns out all i had to do was break the query out into two parts and convert the str(id)'s to int(id)'s.

这篇关于heroku、postgreSQL、django、comments、tastypie:没有运算符匹配给定的名称和参数类型.您可能需要添加显式类型转换的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆