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 に答える