5

モデルエントリを継承する2つの新しいクラスを作成しました。

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を介してこれらの新しいモデルをadminに追加した後、adminを介してコメントまたは割引を作成しようとすると、ValueErrorが発生します。エントリの追加は正常に機能します。

エラーメッセージ:

/ admin / reviews / discount / add /のValueError「」を割り当てることができません:「Discount.discount」は「Discount」インスタンスである必要があります。リクエスト方法:GETリクエストURL: http ://127.0.0.1:8000/admin/reviews/discount/add /例外タイプ:ValueError例外値:
「''」を割り当てることができません:「Discount.discount」は「Discount」である必要があります実例。例外の場所:/Library/Python/2.6/site-packages/django/db/models/fields/related.py in set、211行Python実行可能ファイル:/ usr / bin / python Pythonバージョン:2.6.1

4

2 に答える 2

6

このエラーが発生した理由は、モデル名ですでに使用されているのと同じ列名を使用したためです。Karen T.は、Djangoメーリングリストで次の回答を提供しました。

問題は、コメントモデルのフィールドに同じ名前(小文字のみ)を付けていることのようです。コメントは、multi-table-inheritanceを使用してEntryから継承します。これにより、コメント内のOneToOneFieldがエントリに追加されます。これには、エントリに「コメント」属性を追加するという副作用があります。これは、コメント内のOneToOneFieldの結果としてエントリに関連付けられたコメントにアクセスできるようにする属性であり、デフォルトでは、関連するモデルの名前がす​​べて小文字で指定されます。

この問題は、コメントモデルがエントリのすべてのフィールド/属性を「継承」するときに発生します。エントリから継承された「コメント」属性が、指定されたコメントフィールドを上書きしているようです。これはおそらくバグですが、それ以降は存在しているようです。 1.0.報告されているかどうかを確認するための調査は行っていません。

回避策として、モデル名以外の名前をすべて小文字にするか、子モデルでOneToOneFieldを明示的に指定して、parent_link = Trueを指定し、モデル名以外の名前をrelated_nameにすべて小文字にすることができます。

于 2010-05-16T16:12:51.630 に答える
0

Hunchは、実際のオブジェクトとしてEntryが必要でない限り、Entryクラスを抽象クラスとして宣言することもできると言っています。

...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...
于 2010-05-15T14:18:34.750 に答える