У меня есть модель «Пицца», которая может наследовать «Начинки» от другого экземпляра «Пиццы». Когда я иду обновлять пиццу, чтобы добавить новые начинки, мне нужно запретить пользователю выбирать «я» экземпляр пиццы в родительском списке.
Например: я делаю пиццу Маргарита с начинкой из сыра и помидоров. Затем я создаю еще одну пиццу (Пепперони) и наследую все начинки от Маргариты. Мне нужно, чтобы Пепперони не появлялась в списке «родители», чтобы остановить циклическую ссылку.
модели.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)
формы.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__'
просмотры.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)
Вернулся сюда, чтобы сказать, что я могу получить идентификатор экземпляра так же, как вы демонстрируете, но я пытался использовать его в parent.queryset, не перезаписывая набор запросов при инициализации. Ваше решение работает, спасибо.
Попробуйте создать сквозную модель и добавить к ней CheckConstraint.