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)))

2番目の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 の間に多対多の関係がある場合は、すべての代わりに manytomany マネージャーを使用することもできます。

MyUser.tags.all()
于 2015-04-04T15:19:16.337 に答える