4

结合 django-taggit 定义自定义 Django 用户我遇到了 ORM 问题,我在 django 管理过滤器中也有这个问题。

注意:我正在使用这个片段: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 强制执行此操作?

4

1 回答 1

1

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

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

如果您在 MyUser 和 Tag 之间有 many_to_many 关系,您也可以只使用 manytomany 管理器来代替整个事情:

MyUser.tags.all()
于 2015-04-04T15:19:16.337 回答