我有一个 django 项目,其中包含 2 个这样的应用程序:
## 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
模型进行相同的查询来解决这个问题。这是可以接受的,还是有更好的方法来组织这段代码?