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

时间:2016-03-29 10:26:47

标签: python django django-models

考虑这个简单的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的引用。

2 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是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

如果存在一个优雅的问题,仍然可以解决我原来的问题。

答案 1 :(得分:0)

如果这是专门用于管理员的,则可以通过覆盖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