Запрос другой модели в представлении на основе класса приводит к ошибке

У меня есть две таблицы, в одной из которых записаны возможные товары с их свойствами, в другой - уровни запасов этих соответствующих товаров.

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 возвращает правильное значение, не очень помогает понять, что здесь происходит не так. Может кто-нибудь подскажет мне, как получить нужное значение правильным способом?

TypeError

Изменить последнюю строку с:

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

Вернуться на верх