Django ForeignKey limit_choices_to一个不同的ForeignKey ID

发布于 2021-01-29 17:16:04

我正在尝试使用limit_choices_to限制ForeignKey的Django Admin选择,但是我不知道如何正确地做到这一点。

如果类别ID为16,此代码可以实现我想要的功能,但是我无法弄清楚如何使用当前类别ID,而不是对其进行硬编码。

class MovieCategory(models.Model):    
    category = models.ForeignKey(Category)
    movie = models.ForeignKey(Movie)
    prefix = models.ForeignKey('Prefix', limit_choices_to={'category_id': '16'},
                               blank=True, null=True)
    number = models.DecimalField(verbose_name='Movie Number', max_digits=2,
                                 blank=True, null=True, decimal_places=0)

是否可以某种方式引用类别ForeignKey的ID?

关注者
0
被浏览
47
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    经过数小时的阅读半相关的问题,我终于弄明白了。

    您无法以我尝试的方式自我引用模型,因此无法通过limit_choices_to来使Django达到我想要的方式,因为它无法在同一模型中找到其他ForeignKey的ID。

    如果您更改django的工作方式,显然可以做到这一点,但是解决此问题的一种更简单的方法是改为对admin.py进行更改。

    这是现在我的models.py中的样子:

    # models.py
    class MovieCategory(models.Model):    
        category = models.ForeignKey(Category)
        movie = models.ForeignKey(Movie)
        prefix = models.ForeignKey('Prefix', blank=True, null=True)
        number = models.DecimalField(verbose_name='Movie Number', max_digits=2,
                                     blank=True, null=True, decimal_places=0)
    

    我只是完全删除了limit_choices_to。我在这里找到了由凯尔·邓肯(Kyle
    Duncan)发布的解决方案类似的问题。不过,不同之处在于,它使用的是ManyToMany而不是ForeignKey。这意味着我必须filter_horizontal = ('prefix',)在班级下删除,MovieCategoryAdmin(admin.ModelAdmin):因为这仅适用于ManyToMany字段。

    在admin.py中,我必须from django import forms在顶部添加一个表单。表单外观如下:

    class MovieCategoryForm(forms.ModelForm):
    
        class Meta:
            model = MovieCategory
            fields = ['prefix']
    
        def __init__(self, *args, **kwargs):
            super(MovieCategoryForm, self).__init__(*args, **kwargs)
            self.fields['prefix'].queryset = Prefix.objects.filter(
                                            category_id=self.instance.category.id)
    

    和我的AdminModel:

    class MovieCategoryAdmin(admin.ModelAdmin):
        """
        Admin Class for 'Movie Category'.
        """
        fieldsets = [
            ('Category',      {'fields': ['category']}),
            ('Movie',         {'fields': ['movie']}),
            ('Prefix',        {'fields': ['prefix']}),
            ('Number',        {'fields': ['number']}),
        ]
        list_display = ('category', 'movie', 'prefix', 'number')
        search_fields = ['category__category_name', 'movie__title', 'prefix__prefix']
        form = MovieCategoryForm
    

    凯尔(Kyle)正是在他的回答中描述了它,除了我必须添加fields = ['prefix']到表单中否则它不会运行。如果您按照他的步骤进行操作,并记得删除filter_horizo​​ntal并添加您正在使用的字段,则应该可以使用。

    编辑:此解决方案在编辑时效果很好,但在创建新条目时效果不佳,因为当一个人不退出时,它无法搜索类别ID。我正在尝试找出解决方法。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看