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