我的问题如下:有一段时间我已经习惯在我的Django模型中的属性中封装了一些(最相关且可重用的)查询。
要做到这一点,我经常这样做:
from my_app.models import ModelBla
.....
class ModelBlehhh():
@property
def some_bla_things(self, bla):
return ModelBla.objects.filter(.....)
我一直认为这是一种很好的做法,在我的应用程序中我经常使用它们。
问题是:这些主要用于查询的导入声明会妨碍我的模型'关系结构。含义:在不创建循环导入问题的情况下,我无法创建查询属性,这种情况越来越频繁。
我的方法是否正确?是否有更好的方法来封装这些查询?你通常做什么?
感谢您的帮助。
答案 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?
基本上,它不是别人做的。它取决于你的应用程序的范围。如果您的应用程序是长期应用程序,那么您所做的是错误的。只需使存储库成为可用于所有代码的东西,代码可以在需要时访问它而无需任何循环导入,即没有任何依赖。