私はこのクエリセットを私のdjangoデータベースに作成しました:
material_purchase=Material_Purchase.objects.order_by("material__id","-purchase__date").values("id","material__id","price","purchase__date")
それは私にこれを返しました:
<QuerySet [{"id": 8, "material__id": 1, "price": Decimal("6.00"), "purchase__date": datetime.date(2018, 5, 31)}, {"id": 2, "material__id": 1, "price": Decimal("5.00"), "purchase__date": datetime.date(2018, 4, 29)}, {"id": 9, "material__id": 1, "price": Decimal("3.00"), "purchase__date": datetime.date(2017, 12, 1)}, {"id": 7, "material__id": 2, "price": Decimal("10.00"), "purchase__date": datetime.date(2018, 5, 31)}, {"id": 5, "material__id": 2, "price": Decimal("20.00"), "purchase__date": datetime.date(2018, 5, 16)}, {"id": 1, "material__id": 2, "price": Decimal("27.00"), "purchase__date": datetime.date(2018, 4, 29)}, {"id": 10, "material__id": 2, "price": Decimal("5.00"), "purchase__date": datetime.date(2017, 12, 1)}, {"id": 6, "material__id": 3, "price": Decimal("6.00"), "purchase__date": datetime.date(2018, 5, 31)}, {"id": 11, "material__id": 3, "price": Decimal("5.00"), "purchase__date": datetime.date(2017, 12, 1)}]>
重複するオブジェクトをすべて削除したい最初の(最新のもの)を除いて、同じ「material__id」を使用します。 私は最初に.distinctを使用してこれを実行しようとしましたが、データベースがsqlite3であるため、エラーが発生します。
回答:
回答№1は0私はあなたが .distinct()
querysetメソッド、 material
引数として、次のようなものがあります。
Material_Purchase.objects.order_by("material__id","-purchase__date").values("id","material__id","price","purchase__date").distinct("material__id")
回答№2の場合は0
を使用する .distinct("material_id")
querysetメソッドはPostgreSQLでのみ機能します(ドキュメントを参照してください) ここに)。
何らかの理由で本当にsqliteを使用する必要がある場合は、これは、はるかに効率の低いクエリで実現できます。最初に必要なマテリアルのpkを取得し、次に最終的なクエリでそれらのpkをフィルタリングします。