python - 避免在 Django 应用程序中导入循环模型

标签 python django organization circular-reference contenttype

我有一个包含 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/

相关文章:

python - 表单无效后django上下文表单未呈现

Python-在 panda 数据框之间添加行

python - 如何在Python中使用正则表达式?

python - 使用 py2exe 将 python selenium 脚本构建为 exe

linux - 在Django中连接服务器linux ubuntu系统

javascript - 在包含的情况下, View 必须是可调用的或列表/元组

python - 使用具有多对多关系的 Post 方法的 Django Rest-Framework 错误

testing - 你如何回应论点 "No time to test/develop clean code, because of the deadline"?

MySql/PHP - 设计我的第一个数据库。需要评论

css - JavaFX 元素结构