将ForeignKey选项限制为ManyToMany字段选择



考虑这个简单的Django模型:

class Apple(models.Model):
    oranges = models.ManyToManyField(Orange, related_name='apples')
    selected_orange = models.ForeignKey(Orange, related_name='apples_as_selected')

limit_choices_to添加到ForeignKey字段的正确方法是什么,以便将选择仅限于在此实例中选择的Orange对象?

想这样做:

selected_orange = models.ForeignKey(Orange, related_name='apples_as_selected',
    limit_choices_to: {'apples__id': lambda: self.id})

但我不确定在这种情况下如何获得对self的引用。

解决此问题的一种方法是在ModelForm级别上,如下所示:

class AppleForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['selected_orange'].queryset = Orange.objects.filter(apples__id=self.instance.pk)
class AppleAdmin(admin.ModelAdmin):
    form = AppleForm

如果存在一个优雅的问题,我仍然会为我最初的问题找到一个解决方案。

如果这是专门用于管理的,您可以通过重写get_form方法来自定义编辑现有对象时使用的默认表单:

class AppleAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)
        if obj:
            form.base_fields['selected_orange'].queryset = Orange.objects.filter(
                apples__id=obj.id
            )
        return form

最新更新