11

私はこのような2つのアプリを持つdjangoプロジェクトを持っています:

## tags app, models.py
class Tag(models.Model):
    title = models.CharField(max_length=50)


## items app, models.py
from application.tags.models import Tag

class Item(models.Model):
    title = models.CharField(max_length=300)
    tags = models.ManyToManyField(Tag, related_name="items")

機能の場所を明確にするための更新

items.modelsタグのセットを持つすべてのアイテムを取得する別のモデルのメソッドがあります。

結果のクエリは次のようになります。

## Gets all of the items that have tags t1 and t2
Item.objects.filter(tags=t1).filter(tags=t2)

このメソッドは、タグがアイテムアプリにインポートされるためItem、モデルとモデルを使用します。これは問題ありません。Tag

ただし、タグアプリでこのメソッドにアクセスしたいのですが、そうすると循環インポートが発生します。

今のところ、タグアプリでタグのセットを持つすべてのアイテムを取得するための私の回避策は、多対多のフィールドで逆の関係でセットの共通部分を実行することです。

## Get all items that have the tags with ids tag_ids
item_set = set(Tag.objects.get(pk=tag_ids[0]).items.all())
for cur_tag_id in tag_ids[1:]: ## for all of the rest of the tags
     item_set = item_set & set(Tag.objects.get(pk=cur_tag_id).items.all())

これにより、さらにいくつかのクエリと共通部分が設定されます。Item.objects.filter(tags=t1).filter(tags=t2)...タグアプリのタグモデルからのようなことをする方法はありますか?

モデルに同じクエリを実行させるために使用contenttypesして、これを回避することができました。Itemこれは受け入れられますか、それともこのコードを整理するためのより良い方法がありますか?

4

1 に答える 1

26

外部キーを使用してモデルを定義する場合、次の形式を使用できます。

tags = models.ManyToManyField('tags.Tag', ...)

つまり、タグ アプリをインストールするだけで、Tag クラスをインポートする必要はありません。

次に、タグとアイテムの両方をインポートする可能性のある別の場所に関数を保存でき、循環インポートについて心配する必要はありません。

于 2011-08-03T08:09:10.363 に答える