sql - 为什么此Django原始SQL查询未返回输出?

标签 sql django sqlite django-models django-orm

我有一个尝试在Django中运行的原始SQL查询。当我显示RawQuerySet对象时,它显示正确的查询,但是不返回任何输出。

我尝试将参数转换为字符串,并尝试在参数后附加引号,但这没有用。

我也尝试过相同的查询,但是我对参数进行了硬编码。那行得通。

我也打开了dbshel​​l,以尝试查看查询是否返回输出。它也很好。

这是我在dbshel​​l中运行的内容:

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.py

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)

关于sql - 为什么此Django原始SQL查询未返回输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55360186/

相关文章:

mysql - 如何使用 SQL/mySQL 查询从表中查找相似项?

mysql - 创建表时出错

ios - iOS 上的 SQLite 使用现有架构

mysql - 从连接的 mysql 表中获取列名

SQL:仅选择第二列最常见值是某个值的 id(按 id 分组)

python Django 重置密码 URL NoReverseMatch

python - Django 文件浏览器配置错误

Django:包含 URLconf "does not appear to have any patterns in it"

java - 在哪里使用 JDBC 创建准备好的语句?

android - 如何去除 SQLite 查询中的特定情况