在Django中,如何使用管理器作为默认值而不是相关字段?

时间:2015-03-26 23:25:00

标签: django django-models

我们说我已将FooManager()设置为模型Foo的默认管理员,即让它成为Django在模型中遇到的第一个管理员定义。现在,admin,dumpdata和Django默认情况下会根据需要使用此管理器。

但是,我不希望相关的字段管理员使用FooManager(),即如果FooBar的外键,那么相关的经理bar_instance.foo_set应该使用" plain" Foo经理(在Django文档中使用该术语),而不是FooManager

这似乎不可能,因为FooManager未应用于相关字段的方法是将use_for_related_fields属性设置为False。但所有这一切都是让Django使用相关字段的默认管理器(而不是"普通"经理)。

在这种情况下,默认经理是什么? FooManager!难题。

任何使这项工作的方法,即使用FooManager作为默认管理员而不是相关字段?

注意:我使用的是Django 1.6。我在1.7文档中没有看到任何暗示默认/相关经理行为发生变化的内容。另请注意,我不希望必须根据新的1.7功能明确设置相关管理器here;我希望反向相关管理器默认使用普通管理器,因为我正在重构现有项目,并且不希望更改每个反向相关的管理器参考。

1 个答案:

答案 0 :(得分:1)

this部分,文档说行为正是您想要的行为。

implementation似乎也完全符合您的要求。 1.6也是。

<强>更新

如果您不想更改每种用法,请创建ForeignKey的子类,该子类使用ForeignRelatedObjectsDescriptor的子类作为related_accessor_class并使用this方法覆盖

伪代码:

class PlainManagerForeignRelatedObjectDescriptor(ForeignRelatedObjectDescriptor):

    @cached_property
    def related_manager_cls(self):
        return create_foreign_related_manager(
            models.Manager,
            self.rel,
        )

class PlainManagerForeignKey(ForeignKEy):
    related_accessor_class = PlainManagerForeignRelatedObjectDescriptor