我有一个原始SQL查询,我试图在Django中运行。当我显示RawQuerySet对象时,它显示正确的查询但它没有返回任何输出。
我已经尝试将参数转换为字符串,并尝试在参数中添加引号,但这不起作用。
我也尝试了相同的查询,但我硬编码参数。那很有效。
我也打开了dbshell来尝试查看查询是否返回输出。它也可以正常工作。
这是我在我的dbshell中运行的:
select id FROM recommender_item WHERE
id in (select item_id from
recommender_item_likes where user_id = 1)
and color = 'Black';
请注意,以下查询不起作用:
select id FROM recommender_item WHERE
id in (select item_id from
recommender_item_likes where user_id = 1)
and color = Black;
这是我想要运行的实际查询:
Item.objects.raw('select id FROM recommender_item WHERE
id in (select item_id from recommender_item_likes where
user_id = %s) and %s = %s', [request.user.id, user_pref, pref_choice,])
这与使用硬编码参数的查询相同:
Item.objects.raw('select id FROM recommender_item WHERE
id in (select item_id from recommender_item_likes where user_id = %s)
and color = "Black"', [request.user.id])
我的模板中的输出应该只是这个ID列表:1,64,437,1507,1685
但是,现在它只返回[]
这两种情况下都是RawQuerySet对象:
<RawQuerySet: select id FROM recommender_item WHERE
id in (select item_id from recommender_item_likes where user_id = 1)
and color = Black>
和
<RawQuerySet: select id FROM recommender_item WHERE
id in (select item_id from recommender_item_likes where user_id = 1)
and color = "Black">
从Django调试工具栏检索正在执行的SQL查询:
select id FROM recommender_item WHERE
id in (select item_id from recommender_item_likes where
user_id = '1') and '''color''' = '''"Black"'''
models.朋友
class Item(models.Model):
#id = models.UUIDField(primary_key = True, default = uuid.uuid4, help_text = 'Unique ID for this particular item')
item_type = models.CharField(max_length = 200, null = True, blank = True)
price = models.CharField(max_length = 200, null = True, blank = True)
color = models.CharField(max_length = 200, null = True, blank = True)
image_URL = models.CharField(max_length = 1000, null = True, blank = True)
fit = models.CharField(max_length = 200, null = True, blank = True)
occasion = models.CharField(max_length = 200, null = True, blank = True)
brand = models.CharField(max_length = 200, null = True, blank = True)
pattern = models.CharField(max_length = 200, null = True, blank = True)
fabric = models.CharField(max_length = 200, null = True, blank = True)
length = models.CharField(max_length = 200, null = True, blank = True)
likes = models.ManyToManyField(User, blank = True, related_name = 'item_likes')
此查询应该为您提供用户喜欢的所有黑色项目:
Item.objects.filter(likes=request.user, color='Black')
如果您只需要原始查询中的ID,请添加.values('id')
。
但我仍然觉得你原来的问题更有趣。使用字符串参数向Postgresql发出原始查询没有问题。我将不得不尝试使用Sqlite。
顺便说一句,ORM查询强调likes
是用词不当; likers
或类似的名称似乎更合适。
您可以在filter()
中扩展字典:
filter_field = 'color'
filter_string = 'black'
filter_dict = {filter_field: filter_string}
Item.objects.filter(**filter_dict)
好的,在经过大量的shell和调试工具栏之后,我发现了一种有点多余的方法来实现这一点。创建六个单独的字符串
str1 = 'select id FROM recommender_item WHERE id in (select item_id from recommender_item_likes where user_id ='
str2 = str(request.user.id)
str3 = ') and '
str4 = user_pref
str5 = ' = '
str6 = "'"+pref_choice+"'"
q = str1 + str2+ str3 + str4 + str5 + str6
然后我传递这个变量:Item.objects.raw(q)
这给了我所需的输出。
鉴于模型更改,您应该能够这样做:
Item.objects.filter(likes=request.user)
要么
request.user.item_likes.all()