我有2個應用程序像這樣的Django項目:避免循環模型進口在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")
UPDATE澄清功能定位
我有另一種模型的方法在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())
這會導致多個查詢和一組交集。有沒有一種方法可以在標記應用中的Tag模型中執行類似Item.objects.filter(tags=t1).filter(tags=t2)...
的操作?
我能夠解決這個問題,使用contenttypes
來獲得Item
模型來做出相同的查詢。這是可以接受的,還是有更好的方法來組織這些代碼?
你還沒有真正給出所有的相關信息。您的過濾方法在哪裏定義?爲什麼你不能把它放在兩個應用程序可以導入的地方? –
這就是我想解決的問題。它是項目應用程序中不同模型的一種方法。問題是items.models導入Tag,如果這個方法是在另一個地方,它仍然需要導入Item和Tag。然後Tag不能導入它,否則它仍然是循環的。 – jkeesh