django 如何从引用“self”模型的ManyToMany字段中排除“self”示例?

gzszwxb4  于 2022-11-26  发布在  Go
关注(0)|答案(1)|浏览(161)

我有一个“Pizza”模型,它可以从“Pizza”的另一个示例继承“Toppings”。当我更新Pizza以添加新的浇头时,我需要阻止用户在父列表中选择Pizza的“self”示例。
例如:我创建了一个有奶酪和番茄配料的玛格丽塔比萨饼。然后我创建了另一个比萨饼(意大利辣香肠)并继承了玛格丽塔比萨饼的所有配料。我需要阻止意大利辣香肠出现在“父”列表中以阻止循环引用。

模型.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,但我不确定如何将其传递给表单。

rjzwgtxy

rjzwgtxy1#

您可以覆写PizzaForminit方法:

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)

相关问题