Django ORM无法识别嵌套ON语句中的具体继承



定义一个自定义Django用户并结合Django-taggit我遇到了一个ORM问题,我在Django-admin过滤器中也遇到了这个问题。

注意:我使用的是以下片段:https://djangosnippets.org/snippets/1034/

# User
id   | first_name
---------------------------------
1    | John
2    | Jane
# MyUser
usr_ptr_id | subscription
---------------------------------
1          | 'A'
2          | 'B'

现在,当我使用django-ORM为MyUser过滤某些标签时,例如

MyUser.objects.filter(tags__in=tags)

我得到以下错误:

(1054, "Unknown column 'myapp_user.id' in 'on clause'")

打印的原始查询:

SELECT `myproject_user`.`id`, `myproject_user`.`first_name`, `myapp_user`.`user_ptr_id`, `myapp_user`.`subscription` 
FROM `myapp_user` INNER JOIN `myproject_user` 
ON ( `myapp_user`.`user_ptr_id` = `myproject_user`.`id` ) 
INNER JOIN `taggit_taggedtag` 
ON ( `myapp_user`.`id` = `taggit_taggedtag`.`object_id` 
AND (`taggit_taggedtag`.`content_type_id` = 31)) 
WHERE (`taggit_taggedtag`.`tag_id`) 
IN (SELECT `taggit_tag`.`id` FROM `taggit_tag` WHERE `taggit_tag`.`id` IN (1, 3)))

在第二个ON部分中,将"id"更改为"user_ptr_id"可以使查询正常工作。有什么方法可以用Django ORM强制执行此操作吗?

问题是不能在标签列表中查找ID;您需要在ID列表中查找ID。要解决此问题,请构造一个包含要筛选的所有ID的values_list,然后将该列表传递给原始查询。

id_list = Tag.objects.all().values_list("id")
MyUser.objects.filter(tags__in=id_list)

如果你在MyUser和Tag之间有很多关系,你也可以用很多管理器来代替整个事情:

MyUser.tags.all()

最新更新