我有一个包含 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
模型,这没问题,因为 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
模型来进行相同的查询来解决这个问题。这是可以接受的,还是有更好的方法来组织此代码?
最佳答案
当你用外键定义模型时,你可以使用格式:
tags = models.ManyToManyField('tags.Tag', ...)
这意味着您不需要导入 Tag 类,只需安装标签应用即可。
然后您可以将函数存储在不同的位置,它可能会同时导入 Tag 和 Item,而不必担心循环导入。
关于python - 避免在 Django 应用程序中导入循环模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6923042/