25

2 つのテーブルがproductsありcatagories、外部キーで接続されています。次のようにフィールドproducts.new_costを使用してフィールドを更新する必要があります。catagories.price_markup

UPDATE products p
INNER JOIN categories c ON p.category_id = c.id
SET p.new_cost = ROUND(p.pleer_cost * (1 + c.price_markup/100), -1)
WHERE p.update = 1

SQL ではとても簡単ですが、Django ORM を使用してそれを行うにはどうすればよいでしょうか?

私の単純化された試行は機能しませんCannot resolve keyword 'category.price_markup' into field.:

Product.actived.select_related('category').filter(update=1)).update(new_cost=F('pleer_cost') * F('category.price_markup'))
4

3 に答える 3

18

注: 私の答えは現在古くなって います。この機能を実装するDjango 1.11が導入されました。 OuterRefアンドレイ・ベレンダの回答を確認してください。

ドキュメントによると、join 句を使用した更新はサポートされていません。以下を参照してください。

ただし、filter 句と exclude 句の F() オブジェクトとは異なり、更新で F() オブジェクトを使用する場合は結合を導入できません。更新されるモデルに対してローカルなフィールドのみを参照できます。F() オブジェクトとの結合を導入しようとすると、FieldError が発生します。

# THIS WILL RAISE A FieldError
>>> Entry.objects.update(headline=F('blog__name'))

また、この問題によると、これは仕様によるものであり、近い将来に変更する予定はありません。

ここでの実際の問題は、結合された F() 句が update() ステートメントで許可されていないことです。これは仕様によるものです。update() 句での結合のサポートは、一般的なケースでそれらをサポートする際の固有の複雑さのために、明示的に削除されました。

于 2016-04-21T09:46:15.467 に答える