Djangoで食品ロギングデータベースを構築していますが、クエリ関連の問題があります。
私は、消費モデルを介してM2Mフィールドの「消費者」を介してユーザーモデルに接続された食品モデルを(とりわけ)含めるようにモデルを設定しました。Foodモデルは食品料理を記述し、Consumptionモデルはユーザーの食品の消費量(日付、量など)を記述します。
class Food(models.Model):
food_name = models.CharField(max_length=30)
consumer = models.ManyToManyField("User", through=Consumption)
class Consumption(models.Model):
food = models.ForeignKey("Food")
user = models.ForeignKey("User")
そのユーザーのConsumptionテーブルにFoodオブジェクトが表示された回数(ユーザーが食べ物を消費した回数)順に並べられたすべてのFoodオブジェクトを返すクエリを作成したいと思います。
私は次の行で何かを試しています:
Food.objects.all().annotate(consumption_times = Count(consumer)).order_by('consumption_times')`
ただし、これはもちろん、ユーザーに関連付けられているオブジェクトだけでなく、Foodオブジェクトに関連するすべてのConsumptionオブジェクトをカウントします。モデルを変更する必要がありますか、それともクエリで明らかな何かが欠落しているだけですか?
これはかなりタイムクリティカルな操作であり(特に、フロントエンドのオートコンプリートフィールドに入力するために使用されます)、Foodテーブルには数千のエントリがあるため、データベース側ではなく、データベース側で並べ替えを行います。ブルートフォースメソッドを実行し、次のことを実行して結果を繰り返します。
Consumption.objects.filter(food=food, user=user).count()
次に、Pythonソートを使用してそれらをソートします。ユーザーベースが増えるにつれて、この方法はあまり拡張できないと思います。データベースは、最初から可能な限り将来にわたって利用できるように設計したいと思います。
何か案は?