編集:
みんなが読みすぎないようにするために:問題は私が何を理解していないかです
Q(tag_rep__tag=tag.id)
このモデルでは本当にそうです:
class Item(models.Model):
tag_rep=generic.GenericRelation(TaggedItem)
ほとんどの場合、tag_rep__tagは、単一のタグではなく、タグのリストを返します。だから私は私がしたようにクエリを行うことはできません。tag_rep__tagを比較して、それがどうかを確認するにはどうすればよいですか?
- タグのリストのいずれかが含まれています
- タグのリストがすべて含まれています
タグ付けタグを持つアイテムのクエリセットベースのタグフィルターを作成しようとしています。私はすでにフィルターの作成に成功しましたが、それらはpythonに基づいておりfilter
、リストを返します。
class TagFilter(object):
def __init__(self,any_tags,avoid_tags,all_tags):
# all tags as tag instances
self.any_tags = any_tags
self.avoid_tags = avoid_tags
self.all_tags = all_tags
def seek_any_tags(self, item):
for tag in self.any_tags:
if tag in item.tags:
return True
return False
def items_with_any_tags(self,items):
return filter(self.seek_any_tags,items)
これはかなりうまくいきましたが、フォームセットに渡す代わりにクエリセットが必要になりました。したがって、現在のメソッドはリストを返すため、機能しなくなります。私のモデルのタグにアクセスできるようにするために、私はこれを行いました:
from django.contrib.contenttypes import generic
from tagging.models import TaggedItem
class Item(models.Model):
# some_fields here
tag_rep = generic.GenericRelation(TaggedItem)
フィルタseek_any_tags
は、データベースクエリの形式ですでに再構築できる唯一のものでした。いくつかのSO投稿を読み、多くのグーグルを行った後、私はこの解決策を思いつきました:
def seek_any_tags_qs(self,items):
if self.any_tags!=None:
q = reduce(lambda x, y: x | y, [Q(tag_rep__tag=tag.id) for tag in self.any_tags])
items = items.filter(q)
return items
とてもいいです、そしてはい、私はそれについて少し誇りに思っています。しかし、今、私が構築したいフィルターがさらに2つあります:avoid_any_tags
とseek_all_tags
。私はseek_any_tags
フィルターをしたのと同じ方法でそれらをやろうとしました:
def avoid_any_tags_qs(self,items):
if self.avoid_tags != None:
q = reduce(lambda x, y: x | y, [Q(tag_rep__tag=tag.id) for tag in self.avoid_tags])
items = items.exclude(q)
return items
def seek_all_tags_qs(self,items):
if self.all_tags != None:
q = reduce(lambda x, y: x & y, [Q(_tags__contains=tag.name) for tag in self.seek_tags])
items.filter(q)
return items
avoid_any_tags
なければ、avoid_tagsにタグのいずれかがあるすべてのアイテムを除外する必要があります。最後の1つはseek_all_tags
、all_tagsにすべてのタグがあるアイテムのみを返す必要があります。
しかしavoid_any_tags
、期待どおりには機能しません。これは、avoid_tagsにタグがあり、それ以外の要素がない要素のみを除外します。アイテムにavoid_tagsにないタグが含まれている場合、そのタグは除外されません。なぜだめですか?