Python Django как передать в ManyToMany отфильтрованные данные?

Рейтинг: 0Ответов: 1Опубликовано: 21.08.2023

У меня есть модель Employee, которая имеет responsible: BooleanField поле. Как мне передать в models.ManyToMany только тех Employee, у которых responsible == True?

Примерный набросок кода:

class Employee(models.Model):
    title = models.CharField(max_length=255, null=False, blank=False)
    responsible = models.BooleanField(default=False)
    ...


class Task(models.Model):
    title = models.CharField(max_length=255, null=False, blank=False)
    employees = models.ManyToManyField(Employee)    # Тут необходимо применить фильтр
    ...

При попытке передать вместо Employee уже отфильтрованные данные (Employee.objects.filter(responsible=True)) получил ошибку "Надо передать модель".

Если нужна дополнительная информация - сообщите в комментариях.

Ответы

▲ 1Принят

Предположу, что вы хотите в поле employees отрендеренной формы модели Task видеть список только тех работников, responsible флаг которых равняется True.

В таком случае попробуйте создать отдельную форму и переопределить у неё метод init, в котором будете фильтровать список; затем, используйте новую форму при рендере:

from django import forms

class TasksForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(TasksForm, self).__init__(*args, **kwargs)
        self.fields['employees'].queryset = Employee.objects.filter(responsible=True)

@admin.register(Task)
class TaskAdmin(admin.ModelAdmin):
    form = TasksForm

Результат работы кода