Djangoの管理者で、マルチテーブル継承を持つとValueError
-
27-09-2019 - |
質問
私は継承モデルのエントリ二つの新しいクラスを作成しました
class Entry(models.Model):
LANGUAGE_CHOICES = settings.LANGUAGES
language = models.CharField(max_length=2, verbose_name=_('Comment language'), choices=LANGUAGE_CHOICES)
user = models.ForeignKey(User)
country = models.ForeignKey(Country, null=True, blank=True)
created = models.DateTimeField(auto_now=True)
class Comment(Entry):
comment = models.CharField(max_length=2000, blank=True, verbose_name=_('Comment in English'))
class Discount(Entry):
discount = models.CharField(max_length=2000, blank=True, verbose_name=_('Comment in English'))
coupon = models.CharField(max_length=2000, blank=True, verbose_name=_('Coupon code if needed'))
コメントや管理者を経由して割引を作成しようとすると、admin.site.registerを経由して管理者にこれらの新モデルを追加した後、私はとValueErrorを取得しています。エントリを追加すると、罰金に動作します。
エラーメッセージ:
とValueErrorで/管理/レビュー/割引/追加/
「『』」割り当てることができません:「Discount.discountは、」「ディスカウント」のインスタンスでなければなりません。
要求メソッド:GET
リクエストURL: http://127.0.0.1:8000/admin/reviews/discount/ / に追加
例外の種類:とValueError
例外値:
「『』」割り当てることができません:「Discount.discountは、」「ディスカウント」のインスタンスでなければなりません。
例外の場所:/Library/Python/2.6/site-packages/django/db/models/fields/related.pyのセットの中に、ライン211
Pythonの実行します。/ usr / bin / pythonの
Pythonのバージョン:2.6.1
解決
このエラーの原因は、私はすでにモデル名で使用された同じ列名を使用しているためだっ登場しました。カレンT.はジャンゴメーリングリストの中に次の答えを寄付しました
問題は、あなたが持っているということのようです あなたのコメントモデル内のフィールドの名前 同じ名前を持つ、唯一のケースを下げます。 使用して、エントリから継承コメント マルチテーブル継承。これは、Aが追加されます へのコメントバックにOneToOneField の副作用を有しているエントリ エントリに「コメント」属性を追加します。 これは、次の操作ができます属性であります 関連付けられたコメントへのアクセス 結果としてエントリ コメントにOneToOneField、およびによって それはの名前を与えられているデフォルト 関連するモデル、すべて小文字。
問題はその後するときに発生コメント モデル「継承すべて エントリのフィールド/属性: から継承された「コメント」属性 エントリーは明らかにオーバー乗っています 指定されたコメント欄。そのさん おそらくバグが、それはに表示されます 1.0以降がありました。していません それがされていますかどうかを確認するために任意の研究を行って 報告。
あなたができる回避策としてあなたのフィールド以外の何かに名前を付けます モデル名はすべて小文字、または 明示的に指定することができます 子モデルにOneToOneField、 指定parent_link =真と モデル名以外の何か すべてrelated_nameのために小文字ます。
他のヒント
のHunchはあまりに
、あなたは実際のオブジェクトとしてエントリを必要とする場合を除き、あなたが抽象1としてあなたのエントリークラスを宣言して行うことができ語ります...rest of Entry model here...
created = models.DateTimeField(auto_now_add=True) ## ONLY set date when created, not every save
class Meta:
abstract = True
...methods for your model etc...