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
问题描述
我对 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屋!