Django ORM не может распознать конкретное наследование во вложенной инструкции ON

При определении пользовательского пользователя Django в сочетании с django-taggit я столкнулся с проблемой ORM, у меня также есть эта проблема в фильтрах администратора django.

ПРИМЕЧАНИЕ. Я использую этот фрагмент кода: https://djangosnippets.org/snippets/1034/

# User

id   | first_name
---------------------------------
1    | John
2    | Jane

# MyUser

usr_ptr_id | subscription
---------------------------------
1          | 'A'
2          | 'B'

Теперь, когда я использую ORM django для фильтрации определенных тегов для 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)))

Изменение «id» на «user_ptr_id» во второй части ON заставляет запрос работать. Есть ли способ заставить это с помощью Django ORM?


person user2298943    schedule 07.09.2014    source источник
comment
Можете ли вы добавить код моделей?   -  person Alex Lisovoy    schedule 07.09.2014
comment
Вам нужно предоставить больше информации. Если бы мы могли увидеть, как определяются ваши модели, это помогло бы.   -  person David Sanders    schedule 13.10.2014
comment
нет никакого способа ответить на это с предоставленной информацией. вы должны предоставить еще немного кода.   -  person gloomy.penguin    schedule 14.10.2014


Ответы (1)


Проблема в том, что вы не можете искать идентификатор в списке тегов; вам нужно искать идентификатор в списке идентификаторов. Чтобы исправить это, создайте список значений всех идентификаторов, по которым вы хотите фильтровать, а затем вместо этого передайте этот список в исходный запрос.

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

Если у вас есть отношение many_to_many между MyUser и Tag, вы также можете просто использовать менеджер manytomany вместо всего этого:

MyUser.tags.all()
person Robert Townley    schedule 04.04.2015