Как исключить экземпляр '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)