0

我的问题如下:有一段时间,我习惯于将我的应用程序的一些(最相关和可重用的)查询封装在我的 Django 模型中的属性中。

为此,我经常这样做:

from my_app.models import ModelBla

.....

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

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

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

我的方法正确吗?有没有更好的方法来封装这些查询?你平常都做什么?

谢谢你的帮助。

4

2 回答 2

1

我根本不明白你为什么需要这些属性,更不用说导入了。

如果您要根据当前模型过滤其他模型,那一定意味着您与该模型有关系。如果你有一个关系,那么你应该使用自动向后关系。所以与其说SomeOtherModel.objects.filter(blah=self),你应该做self.someothermodel_set.all()的。

于 2013-02-06T06:15:40.870 回答
0
Is there a better way to encapsulate these queries?

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

What do you usually do?

基本上,这不是其他人所做的。这取决于您的应用程序的范围。如果您的应用程序是长期应用程序,那么您所做的就是错误的。只需制作一个可用于所有代码的存储库,并且代码可以在需要时访问它,而无需任何循环导入,即没有任何依赖关系。

于 2013-02-05T16:55:55.227 回答