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