Как исключить экземпляр 'self' из поля ManyToMany, которое ссылается на модель 'self'?

У меня есть модель 'Pizza', которая может наследовать 'Toppings' от другого экземпляра 'Pizza'. Когда я обновляю модель Pizza, чтобы добавить новые топпинги, мне нужно предотвратить выбор пользователем "собственного" экземпляра Pizza в родительском списке.

Например: Я создаю пиццу "Маргарита" с начинкой из сыра и помидоров. Затем я создаю другую пиццу (Пепперони) и наследую все начинки от Маргариты. Мне нужно запретить Pepperoni появляться в списке 'parents', чтобы остановить круговую ссылку.

models.py

class Topping(models.Model):
    name = models.CharField(max_length=100)


class Pizza(models.Model):
    name = models.CharField(max_length=100)
    parents = models.ManyToManyField("self", symmetrical=False)
    toppings = models.ManyToManyField(Topping)

forms.py

class PizzaForm(ModelForm):

    toppings = forms.ModelMultipleChoiceField(
        queryset=Topping.objects.all(),
        widget=forms.CheckboxSelectMultiple,
        required=False
    )

    parents = forms.ModelMultipleChoiceField(
        queryset=Pizza.objects.all(),
        widget=forms.CheckboxSelectMultiple,
        required=False
    )

    class Meta:
        model = Pizza
        fields = '__all__'

views.py

class PizzaUpdateView(UpdateView):
    model = Pizza
    form_class = PizzaForm

Я подозреваю, что мне нужно изменить родительский набор запросов в PizzaForm, чтобы исключить PK, но я не знаю, как передать это форме из моего представления.

Вы можете переопределить метод init из PizzaForm:

class PizzaForm(ModelForm):

    toppings = forms.ModelMultipleChoiceField(
        queryset=Topping.objects.all(),
        widget=forms.CheckboxSelectMultiple,
        required=False
    )

    parents = forms.ModelMultipleChoiceField(
        queryset=Pizza.objects.all(),
        widget=forms.CheckboxSelectMultiple,
        required=False
    )

    class Meta:
        model = Pizza
        fields = '__all__'

    def __init__(*args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['parents'].queryset = Pizza.objects.exclude(id=self.instance.id)
Вернуться на верх