2

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

4

2 に答える 2

1

探している結果が Tag1 と Tag2 を持つ TaggedObject である場合は、ObjectTagBridge をクエリする代わりに TaggedObject をクエリすることを検討してください。クエリは次のようになります。

results = TaggedObject.objects.filter(objecttagbridge__tag = Tag1).filter(objecttagbridge__tag = Tag2)

基本的に、2 つのフィルターを実行しています。Tag1 と Tag2 の両方を持つオブジェクトのみがフィルタリング基準を満たし、結果セットの一部になります。

于 2010-05-09T03:13:13.117 に答える
0

多対多テーブルを手動で実装し、それを一般的なリレーションと結合しようとしているようです。より良いアプローチは、Django に M2M を処理させ、次のように一般的な関係で表現することです。

class TaggedObject(models.Model):
    """
        Help to connect a generic object to a Tag.
    """
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    tags = models.ManyToManyField('Tag')

class Tag(models.Model):
    ...

これにより、あなたがやろうとしていたことができるはずです...

objects = TaggedObject.objects.filter(
    Q(tags=Tag1) & Q(tags=Tag2)
)
于 2010-04-27T21:01:28.070 に答える