4

契約は次のとおりです。

私は 2 つの db モデルを取得ShoppingCartOrderました。DRY 原則に従って、いくつかの一般的な小道具/メソッドを共有インターフェイスに抽出したいと思いますItemContainer

_flush()主に関連するオブジェクト セットの削除を実行するメソッドに出会うまで、すべてがうまくいきました。

class Order(models.Model, interface.ItemContainer):

# ...

def _flush(self):
    # ...
    self.orderitem_set.all().delete()   

問題は、それが何であるかを動的に知るにはどうすればよいかということorderitem_setですshoppingcartitem_set

4

2 に答える 2

3

まず、まさにあなたが探しているものであるはずの 2 つの Django スニペットを次に示します。

次に、設計を再考し、単純なメソッドを持つdjango.contribコンテンツ タイプ フレームワークに切り替えることをお勧めします。.model_class()(上記の最初のスニペットもコンテンツ タイプ フレームワークを使用しています)。

3 番目に、おそらくモデル クラスで多重継承を使用したくないでしょう。それは必要ないはずであり、あいまいな副作用があったとしても驚かない. interface.ItemContainerから継承してmodels.ModelからOrder継承するだけinterface.ItemContainerです。

于 2009-02-05T10:26:58.953 に答える
2

ForeignKey の related_name 引数を設定できるため、デザインに最小限の変更を加えたい場合は、ShoppingCartItem と OrderItem の ForeignKey に同じ related_name をそれぞれ ShoppingCart と Order に設定することができます ("item_set" のようなもの):

order = models.ForeignKey(Order, related_name='item_set')

cart = models.ForeignKey(ShoppingCart, related_name='item_set')
于 2009-02-05T17:31:21.123 に答える