3つのモデルがあり、TaggedObjectにはObjectTagBridgeとのGenericRelationがあります。また、ObjectTagBridgeにはタグモデルへの外部キーがあります。
class TaggedObject(models.Model):
"""
class that represent a tagged object
"""
tags = generic.GenericRelation('ObjectTagBridge',
blank=True, null=True)
class ObjectTagBridge(models.Model):
"""
Help to connect a generic object to a Tag.
"""
# pylint: disable-msg=W0232,R0903
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
tag = models.ForeignKey('Tag')
class Tag(models.Model):
...
タグをオブジェクトにアタッチするときは、新しいObjectTagBridgeを作成し、そのForeignKeyタグをアタッチするタグに設定します。これは正常に機能しており、オブジェクトに添付したすべてのタグを非常に簡単に取得できます。しかし、Tag1とTag2を持つすべてのオブジェクトを取得(フィルタリング)したい場合は、次のようにしようとしました。
query = Q(tags__tag=Tag1) & Q(tags__tag=Tag2)
object_list = TaggedObjects.filter(query)
しかし、私のobject_listは空です。これは、2つのタグオブジェクトを持つ1つのObjectTagBridgeを持つTaggedObjectsを探しているためです。最初のオブジェクトはTag1で、2番目のオブジェクトはTag2です。
私のアプリケーションはこれよりも複雑なQクエリになるので、このQオブジェクトを使用したソリューションが必要だと思います。実際、次のようなバイナリ接続詞の任意の組み合わせ:(...) and ( (...) or not(...))
これを正しくフィルタリングするにはどうすればよいですか?すべての答えは大歓迎です、多分これを達成するための別の方法もあります。
あなたの助けのためのthx!!!