在基于 class 的视图中查询其他模型会产生错误

Querying other Model in class-based view produces error

我有两个 table,其中一个记录了可能的物品及其属性,另一个记录了这些物品的库存水平。

class itemtype(models.Model):
    item_id = models.IntegerField(primary_key=True)
    item_name = models.CharField(max_length=100)
    group_name = models.CharField(max_length=100)
    category_name = models.CharField(max_length=100)
    mass = models.FloatField()
    volume = models.FloatField()
    packaged_volume = models.FloatField(null=True)
    used_in_storage = models.BooleanField(default=False, null=True)

    class Meta:
        indexes = [
            models.Index(fields=['item_id'])
        ]

    def __str__(self):
        return '{}, {}'.format(self.item_id, self.item_name)

class material_storage(models.Model):
    storage_id = models.AutoField(primary_key=True)
    material = models.ForeignKey(itemtype, on_delete=models.PROTECT)
    amount_total = models.IntegerField(null=True)
    price_avg = models.FloatField(null=True)
    amount = models.IntegerField(null=True)
    price = models.FloatField(null=True)
    timestamp = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return '{}, {} avg.: {} ISK'.format(self.material, self.amount, self.price)

我有一个基于 table material_storage 的 ModelForm,其中一个复选框指示是否应包括运输成本。 在此 ModelForm class 的 form_valid() 方法中执行计算。为此,我必须检索给定项目的每单位体积,以将其用于我的运输成本计算。尝试按照下面显示的方式获取该值会导致我不太理解的错误。

class MaterialChoiceField(forms.ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.item_name


class NewAssetForm(forms.ModelForm):

    material = MaterialChoiceField(models.itemtype.objects.filter(used_in_storage= True))
    needs_transport = forms.BooleanField(required=False)

    def __init__(self, *args, **kwargs):
        super(NewAssetForm, self).__init__(*args, **kwargs)
        self.fields['amount'].widget.attrs['min'] = 1
        self.fields['price'].widget.attrs['min'] = 0.00

    class Meta:
        model = models.material_storage
        fields = ( 
            'material',
            'amount',
            'price',    
        )

        widgets = {
            'material': forms.Select(),    
        }


class NewItemView(FormView):

    template_name = 'assetmanager/newasset.html'
    form_class = forms.NewAssetForm
    success_url = '/storage/current'

    def form_valid(self, form):
    
        unit_volume = itemtype.objects.values('packaged_volume').filter(item_id=form.cleaned_data['material'])[0]['packaged_volume']

我认为这与查询与表单中指定的模型不同的模型有关,但我不明白到底是什么问题。尤其是 运行 在 django shell returns 中完全相同的查询,正确的值并不能真正帮助理解这里出了什么问题。有人可以告诉我如何以正确的方式获得所需的值吗?

更改最后一行:

unit_volume = itemtype.objects.values('packaged_volume').filter(item_id=form.cleaned_data['material'])[0]['packaged_volume']

至:

unit_volume = itemtype.objects.values('packaged_volume').filter(item_id=form.cleaned_data['material'].item_id)[0]['packaged_volume']

错误说,您正在将 Item 实例提供给查询,item_id 在哪里询问。