limit_choices_to 的 Django 抽象模型覆盖方法

Posted

技术标签:

【中文标题】limit_choices_to 的 Django 抽象模型覆盖方法【英文标题】:Django abstract model override method for limit_choices_to 【发布时间】:2016-05-13 00:34:42 【问题描述】:

这是我的模型:

class BudgetName(model.Models):
    name = models.CharField(max_length=150)
    type = models.IntegerField(default=0,choices=((0,'incomes'),(1,'outcomes')))

class FinancialModel(models.Models):
    class Meta:
        abstract = True

    def my_limit_choices():
        return None

    """ Here goes some price fields, not important here """
    budgetname = models.ForeignKey(BudgetName, limit_choices_to= my_limit_choices)

class Incomes(FinancialModel):
    def my_limit_choices():
        return 'type':0

class Outcomes(FinancialModel):
    def my_limit_choices():
        return 'type':1

它在抽象类中运行良好 - 当我尝试在 my_limit_choices 方法中过滤某些内容时。但是,似乎它们没有在子类中被覆盖。为什么以及如何解决这个问题?

【问题讨论】:

不,没关系。否则会抛出:my_limit_choices() takes exactly 1 argument (0 given). 【参考方案1】:

不能让limit_choices_to调用实例方法my_limit_choices

另一种方法是定义一个自定义模型表单,并在__init__ 方法中设置查询集。

class FinancialModelForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(MyOrderForm, self).__init__(*args, **kwargs)
        self.fields['budgetname'].queryset = BudgetName.objects.filter(**self.instance.my_limit_choices())

然后在您的模型管理员中使用此表单:

class IncomesAdmin(admin.ModelAdmin):
    form = FinancialModelForm

class OutcomesAdmin(admin.ModelAdmin):
    form = FinancialModelForm

admin.site.register(Incomes, IncomesAdmin)
admin.site.register(Outcomes, OutcomesAdmin)

【讨论】:

以上是关于limit_choices_to 的 Django 抽象模型覆盖方法的主要内容,如果未能解决你的问题,请参考以下文章

Django ForeignKey.limit_choices_to 与 ForeignKey to ManyToMany 场景

Django-form组件中过滤当前用户信息

limit_choices_to

django-外键和表关系

自定义组件之crm的业务逻辑

Django初识