Фильтрация параметров поля Django M2M с помощью набора запросов

Я хочу отфильтровать параметры, которые появляются в поле M2M формы, с помощью набора запросов. Я читал, что limit_choices_to можно использовать только с ForeignKey. Есть ли что-то похожее на limit_choices_to, которое можно применить к M2M?

Это моя модель:

class Inspection(models.Model):

    ref         = models.CharField(max_length=50)
    tools       = models.CharField(max_length=150,null=True,blank=True)
    areas       = models.ManyToManyField('specimens.Area',null=True,blank=True)

А это модель поля M2M:

class Area(models.Model):

    ref         = models.CharField(max_length=10)
    description = models.TextField(max_length=150)
    specimen    = models.ForeignKey(Specimen)

    class Meta:
        unique_together = ['ref','specimen']

Я хотел бы отфильтровать области проверки с помощью набора запросов: Area.objects.filter(specimen="specimen")

Другое сообщение (Многие для многих и как получить набор запросов из набора запросов) объясняет, как это сделать, изменяя форму администратора, я думаю (я не очень понимаю это), но это не работает для меня, получаю DoesNotExist ошибки или Super ошибки. Должен ли я поменять свой InspectionForm на InspectionAdminForm, на котором написано сообщение раньше?

введите описание изображения здесь

Любые идеи?

РЕДАКТИРОВАТЬ-1:

Я понял, что это вызывает другую ошибку:

введите описание изображения здесь

Это полный код, который я использовал:

class InspectionAdminForm(forms.ModelForm):

    class Meta:
        model = Inspection

    def __init__(self, *args, **kwargs):
        super(InspectionAdminForm,self).__init__(*args,**kwargs)
        self.fields['areas'].queryset = Area.objects.filter(specimen=self.instance.specimen)



class InspectionAdmin(admin.ModelAdmin):
    form = InspectionAdminForm
    filter_horizontal = ['areas']

person DavidRguez    schedule 30.10.2014    source источник
comment
Выполняли ли вы makemigrations и migrate после настройки моделей? Похоже, он не знает, куда поместить ваши данные (и не получить их) ...   -  person mccc    schedule 30.10.2014
comment
Ты прав. Я забыл мигрировать. Решил последнюю ошибку. Сейчас у меня нет ошибок, но фильтр набора запросов работает только в моем представлении администратора, а в моей форме я все еще просматриваю все параметры области без фильтрации.   -  person DavidRguez    schedule 30.10.2014


Ответы (1)


Поскольку я установил некоторые начальные параметры для моей Inspection modelForm, я установил:

inspectionform = InspectionForm(None, initial={'specimen':specimen})

Я также меняю __init__ метод InspectionForm:

class InspectionForm(forms.ModelForm):

    class Meta:
        model = Inspection

    def __init__(self, *args, **kwargs):
        super(InspectionForm,self).__init__(*args,**kwargs)
        self.fields['areas'].queryset = Area.objects.filter(specimen=kwargs['initial']['specimen'].id)

И это все! Теперь отлично работает.

person DavidRguez    schedule 30.10.2014