Запрос другой модели в представлении на основе класса приводит к ошибке
У меня есть две таблицы, в одной из которых записаны возможные товары с их свойствами, в другой - уровни запасов этих соответствующих товаров.
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)
У меня есть ModelForm, основанная на таблице material_storage, в которой чекбокс указывает, нужно ли включать транспортные расходы или нет. В методе form_valid() этого класса ModelForm выполняются вычисления. Для этого мне необходимо получить объем единицы данного товара, чтобы использовать его для расчета транспортных расходов. Попытка получить это значение способом, показанным ниже, приводит к непонятной мне ошибке
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 возвращает правильное значение, не очень помогает понять, что здесь происходит не так. Может кто-нибудь подскажет мне, как получить нужное значение правильным способом?

Изменить последнюю строку с:
unit_volume = itemtype.objects.values('packaged_volume').filter(item_id=form.cleaned_data['material'])[0]['packaged_volume']
to:
unit_volume = itemtype.objects.values('packaged_volume').filter(item_id=form.cleaned_data['material'].item_id)[0]['packaged_volume']
Ошибка гласит, что вы передаете в запрос экземпляр Item, где спрашивается item_id