导入模型以在属性中封装查询会导致循环导入问题

时间:2013-02-05 16:50:41

标签: django django-models circular-dependency project-structure

我的问题如下:有一段时间我已经习惯在我的Django模型中的属性中封装了一些(最相关且可重用的)查询。

要做到这一点,我经常这样做:

from my_app.models import ModelBla

.....

class ModelBlehhh():
    @property
    def some_bla_things(self, bla):
        return ModelBla.objects.filter(.....)

我一直认为这是一种很好的做法,在我的应用程序中我经常使用它们。

问题是:这些主要用于查询的导入声明会妨碍我的模型'关系结构。含义:在不创建循环导入问题的情况下,我无法创建查询属性,这种情况越来越频繁。

我的方法是否正确?是否有更好的方法来封装这些查询?你通常做什么?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我根本不知道为什么你需要这些属性,更不用说进口了。

如果您根据当前模型筛选其他模型,则必须表示您与该模型有关系。如果你有关系,那么你应该使用自动向后关系。因此,而不是SomeOtherModel.objects.filter(blah=self),您应该self.someothermodel_set.all()

答案 1 :(得分:0)

Is there a better way to encapsulate these queries?

实际上,你不应该让循环依赖吃掉你,而是去除它。这将增加您在项目的后期阶段对数据库的访问。您可以通过在此阶段重新定义结构来删除循环导入,否则重构和纠正错误的地方为时已晚。

What do you usually do?

基本上,它不是别人做的。它取决于你的应用程序的范围。如果您的应用程序是长期应用程序,那么您所做的是错误的。只需使存储库成为可用于所有代码的东西,代码可以在需要时访问它而无需任何循环导入,即没有任何依赖。