1

このエンジンがどのように機能するかは完全にはわかりませんが、シナリオを設定させてください。次のようなモデルクラスを使用したDjango-Mongoプロジェクトがあります。

class BaseModel(models.Model):
    created_at = models.DateTimeField(null=False, auto_now_add=True)
    modified_at = models.DateTimeField(null=False, auto_now=True)

たくさんの基本モデルを作成しましたが、プロジェクトのすべてがうまく機能し、多くのデータを取得できました。その後、プロジェクトが大きくなり、BaseModel を拡張する必要があります。突然次のようになります。

class BaseModel(models.Model):
    created_at = models.DateTimeField(null=False, auto_now_add=True)
    modified_at = models.DateTimeField(null=False, auto_now=True)
    active = models.BooleanField(default=True)

したがって、mongo を使用すると、データベースに触れることなくこれを変更できることがわかりますが、次に行うことは、次のようなクエリを実行することです。

BaseModel.objects.filter(active=True)

デフォルトを使用する必要があるが、まだアクセスされていない古いレコードがこのクエリに表示されることを期待する必要がありますか? または、探している値がデフォルトと一致することを認識するために、クエリ エンジンに固有の操作を行う必要がありますか?

4

1 に答える 1

0

わかりました、試行錯誤の末に答えを見つけました。Django がクエリを実行すると、データベース内の Mongo の内容が検索され、デフォルト設定は無視されます。ただし、既にオブジェクトを取得している場合、Django は既定値をメモリ内のオブジェクトに配置します (ただし、Mongo レコードには配置しません)。

これはちょっとひどいようです。つまり、リファクタリングされたフィールドに対してクエリを実行する前に、次のようなことを 1 回行う必要があります。

for mod in BaseModel.objects.all():
    mod.save()

言うまでもなく、これは潜在的に非常に高価なクエリです。ありがたいことに、一度だけ実行する必要がありますが、それでも実行する必要があります。

より良い代替案があれば、それは素晴らしいことです。

于 2012-10-09T05:23:40.600 に答える