Мне надо отфильтровать service по queryset из init, как передать переменную?

Как передать self.fields['category_service'].queryset в Device.objects.filter переменной device?

class FastOrderAddForm(forms.ModelForm):
    device = ChoiceTxtField(queryset=Device.objects.filter(category_service=ТУТ_QUERYSET_ИЗ_INIT).order_by('-used'))
​
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(FastOrderAddForm, self).__init__(*args, **kwargs)
        self.fields['category_service'].queryset = getCategoryServicePermission(user=self.request.user)
​
    class Meta:
        model = Orders
        fields = ['device','category_service']
        widgets = {
            'category_service': forms.Select(attrs={'class': 'form-control', 'autocomplete': 'on'}),
        }

Можно попробовать переопределить метод clean()

class FastOrderAddForm(forms.ModelForm):
    device = ChoiceTxtField(queryset=Device.objects.none())
    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(FastOrderAddForm, self).__init__(*args, **kwargs)
        self.fields['category_service'].queryset = getCategoryServicePermission(user=self.request.user)
    
    def clean(self):
        cleaned_data = super().clean()
        category_service = cleaned_data.get("category_service")
        self.fields['device'].queryset = Device.objects.filter(category_service=category_service).order_by('-used')
    class Meta:
        model = Orders
        fields = ['device','category_service']
        widgets = {
            'category_service': forms.Select(attrs={'class': 'form-control', 'autocomplete': 'on'}),
        }

Ещё можно применить forms.pre_clean

from django.dispatch import receiver
from django import forms

@receiver(forms.pre_clean)
def set_device_queryset(sender, **kwargs):
    if isinstance(sender, FastOrderAddForm):
        cleaned_data = kwargs['cleaned_data']
        category_service = cleaned_data.get("category_service")
        sender.fields['device'].queryset = Device.objects.filter(category_service=category_service).order_by('-used')

Ещё способ:

from django.db.models.signals import pre_save
from django.dispatch import receiver

@receiver(pre_save, sender=FastOrderAddForm)
def update_device_queryset(sender, instance, **kwargs):
    instance.fields['device'].queryset = Device.objects.filter(category_service=instance.cleaned_data.get('category_service')).order_by('-used')
Вернуться на верх