Избегайте импорта круговой модели в 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")

ОБНОВЛЕНИЕ ДЛЯ УТОЧНЕНИЯ РАСПОЛОЖЕНИЯ ФУНКЦИЙ

У меня есть метод для другой модели в 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 выполняла тот же запрос. Это приемлемо или есть лучший способ организовать этот код?

8
задан jkeesh 3 August 2011 в 23:08
поделиться