実現したいこと
大目的
いくつかのクラスで下記のようなsaveメソッドのオーバーライドが複数あるので、
それらを一つのコードにまとめて共通化したいです。
小目的
共通化するために、下記のコードに記載してあるFruitクラスのインスタンスを
HogeMixinのクラスに渡したいです。
class Fruit(models.Model): quantity = models.ForeignKey("Quantity", on_delete=models.CASCADE, null=True) kind = = models.IntegerField(default=0) # 共通化したい箇所 def save(self, *args, **kwargs): if self._state.adding: if self.quantity: self.kind = self.quantity.kind self.kind = self.quantity.kind return super().save(*args, **kwargs)
該当のソースコード
python
1# 共通化するために、mixinを作成 2class HogeMixin(models.Model): 3 def save(self, *args, **kwargs): 4 if self._state.adding: 5 if self.quantity: # selfにFruitのインスタンスを渡したいです。 6 self.kind = self.quantity.kind 7 self.kind = self.quantity.kind 8 9 return super().save(*args, **kwargs) 10
python
1class Fruit(HogeMixin): 2 # models.ModelはHogeMixinに継承させました 3 quantity = models.ForeignKey("Quantity", on_delete=models.CASCADE, null=True) 4 kind = = models.IntegerField(default=0) 5 6 a = HogeMixin() 7 a.save() 8
発生している問題・エラーメッセージ
上記のコードを作成して、正しく動作するか単体テストを実行したところ
下記のエラーが表示されました。
(コードを共通化する前は、テストをクリアしていたのでテスト自体に問題はないと思います。)
AttributeError: 'HogeMixin' object has no attribute 'quantity'
試したこと
AttributeError: 'HogeMixin' object has no attribute 'quantity'
のエラーが出るということは、 if self.quantity:
のselfはHogeMixinを指している
と考えています。
下記の記事を参考に、継承元(HogeMixin)で継承先(Fruit)のインスタンスを参照するようにコードを書き換えました。
https://naruport.com/blog/2019/8/24/python-tutorial-class-extends/
selfの型がCatになっているのがわかります。
このように、継承先(Cat)で継承元(Animal)のメソッドを呼び出すと、メソッドのselfは継承先(Cat)のインスタンスになります。
何か解決の糸口になるヒントを頂けますと幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/05/24 14:22