편집 :어떻게 이러한 목록 필터를 db 쿼리로 변환 할 수 있습니까?
너무 많이 읽는 모든 사람을 방지하려면 : 대부분의 아마
class Item(models.Model):
tag_rep=generic.GenericRelation(TaggedItem)
tag_rep__tag : 문제는 내가
Q(tag_rep__tag=tag.id)
정말이 모델을 위해 무엇을 이해하지 못하는 것입니다 단일 태그가 아닌 태그 목록을 반환합니다. 그래서 나는 내가했던 것처럼 질의를 할 수 없다. 내가 tag_rep__tag을 비교할 수 있습니다 어떻게
- 는
- 가 나는의 검색어를 구축하기 위해 노력하고있어 태그
의 목록이 모두 포함 태그 목록 중 하나를 포함하고 있는지 확인하려면 태그 태그가있는 항목에 대한 태그 기반 태그 필터. 나는 allready 필터의 생성에 성공, 그러나 그들은 비단뱀 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)
이 꽤 잘 작동,하지만 지금은 해당 formset에 전달하는 대가로 검색어 세트가 필요합니다. 그래서 현재의 메소드는 더 이상 작동하지 않습니다.리스트를 리턴합니다. 내가 이런 짓을 내 모델의 태그에 액세스 할 수 있도록 :
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
것은 내가 allready 데이터베이스 쿼리의 형태로 다시 수있는 유일한 사람이었다. 일부 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
아주 좋은, 그리고 예, 내가 조금 자랑스럽게 생각합니다. 하지만 이제는 빌드하려는 필터가 두 개 더 있습니다. 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의 태그 중 하나를있는 모든 항목을 제외해야합니다. 마지막 하나 인 seek_all_tags
은 all_tags에 모든 태그가있는 항목 만 반환해야합니다.
그러나 avoid_any_tags
은 exected로 작동하지 않습니다. avoid_tags에 태그가 있고 다른 태그는없는 요소 만 제외합니다. 항목에 avoid_tags에없는 태그가 있으면 제외되지 않습니다. 왜 안돼?
이 필터는 별도의 쿼리 세트 개체에 사용됩니까? 아니면 하나 하나를 통과시키고 필터와 제외를 겹쳐서 사용하고 있습니까? – jdi
나는 그 (것)들을 위로 쌓고있다, 그러나 나는 그것이 문제가 아니다고 생각한다. 나는 다른 순서로 몇 번 확인했다. 업데이트는 2 분 안에있을 것이고, 아마 핵심을 찾았을 것입니다. – marue