Home > Net >  Querying other Model in class-based view produces error
Querying other Model in class-based view produces error

Time:03-22

I have two tables, in one of which the possible items with their properties are recorded, in the other the stock levels of these respective items are recorded.

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)

I have a ModelForm based on the table material_storage, in which a checkbox indicates whether transport costs should be included or not. In the form_valid() method of this ModelForm class the calculations are performed. To do so, I have to retrieve the volume per unit of the given item to use it for my transport cost calculations. Trying to geht that value the way shown below leads to an error I don't really understand.

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']

I believe that this has something to do with querying a different model than specified in the form, but I don't understand what exactly is the problem. Especially the fact, that running the exact same query in the django shell returns the correct value does not really help to understand what is going wrong here. Could somebody please tell me how to get the desired value the correct way?

TypeError

CodePudding user response:

Change last line from:

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']

The error says, you are giving Item instance to the query, where is item_id asked.

  • Related