0

ここに似たような質問がたくさんあることは知っていますが、バグのように見えるので、これは異なります。

モデル:

class Item(BaseModel):
    serial = AutoField(primary_key=True)
    prod = ForeignKey(Product, verbose_name='Product')
    account = ForeignKey(Account, verbose_name='Account')
    pdate = DateField(null=True, verbose_name='Date') # Paid date, for imported licenses only
    price = DecimalField(max_digits=10, decimal_places=2, default=0)
    discount = FloatField(default=0.0)
    vat = ForeignKey(Vat, null=True) # Null is for imported licenses
    disabled = BooleanField(default=False) # To activate/deactivate license

class Discount(BaseModel):
    ID = AutoField(primary_key=True)
    name = CharField(max_length=32)
    rate = FloatField(verbose_name='Rate (%)', help_text=get_help('discount__rate'))
    disabled = BooleanField(default=False)
    def __unicode__(self):
        return u'%s, %s%'%(self.name, self.rate)

形:

class InvAddProdForm(ModelForm):
    qty = IntegerField(initial=1)
    class Meta:
        model = Item
        fields = ('prod','account','discount','vat')
    def __init__(self, *args, **kwargs):
        super(InvAddProdForm, self).__init__(*args, **kwargs)
        self.fields['prod'].empty_label = None
        self.fields['prod'].queryset = Product.objects.filter(disabled=False).order_by('name')
        self.fields['account'].empty_label = None
        self.fields['vat'].empty_label = 'AUTO'
        self.fields['vat'].required = False
        self.fields['vat'].queryset = Vat.objects.filter(disabled=False).order_by('name')

ご覧のとおり、クラス割引は存在しますが、Itemはそれを使用しません。それでも、InvAddProdFormのインスタンスを作成しようとすると、例外が発生します。

ValueError at /invoice/10000/
Cannot assign "0.0": "Item.discount" must be a "Discount" instance.

誰かがこれを理解できますか?とても独特だと思います。Itemの割引フィールドがForeignKeyフィールドである場合、それは私には意味がありますが、そうではありません。FloatFieldです

4

1 に答える 1

3

これ

discount = FloatField(default=0.0)

する必要があります

discount = ForeignKey(Discount)

アップデート

さて、おそらく起こったことは、models.pyがデータベーススキーマの外観と同期していないことです。おそらく、外部キーからフロートフィールドに変更しました。したがって、データベースでもこれを変更する必要があります。これを行うには2つの方法があります。

  1. テーブルを削除して、syncdbを再度実行します
  2. を使用する

PSおそらくdiscount10進フィールドとして保存する必要があります

于 2012-12-28T10:24:18.150 に答える