【问题标题】:How to create a custom manager for related objects?如何为相关对象创建自定义管理器?
【发布时间】:2016-05-18 19:33:03
【问题描述】:

我有这些相关模型,其中一个有自定义管理器

类设备(型号): 名称 = CharField() 类 DeviceSettingManager(管理器): use_for_related_fields = True 类设置(模型): 名称 = CharField() 值 = CharField() device = ForeignKey(Device, related_name='settings') 对象 = DeviceSettingManager

但是当我运行 Django shell 时,我看到正在使用“RelatedManager”管理器

>>> d = Device.objects.all()[0] >>> 类型(d.settings) django.db.models.fields.related.create_foreign_related_manager..RelatedManager

如何让 DeviceSettingManager 用于设备设置?

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    不要介意在经理上调用type() 的结果,DeviceSettingManager 实际上正在使用中。您可以通过以下方式检查:

    class DeviceSettingManager(models.Manager):
        use_for_related_fields = True
    
        def manager_status(self):
            print("Device Setting Manager is Active")
    

    然后调用:

    >>> d = Device.objects.all()[0]
    >>> d.settings.manager_status()
    Device Setting Manager is Active
    

    即使您明确地将管理器传递给相关对象,例如:

    >> d.settings(manager="settings_objects")
    

    当然还有:

    class Setting(Model):
        name = CharField()
        value = CharField()
        device = ForeignKey(Device, related_name='settings')
    
        settings_objects = DeviceSettingManager() # Notice the parenthesis
    

    经理的class仍会显示为:django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager

    别在意class 的名字。

    【讨论】:

    • 不起作用。当我尝试调用管理器方法时收到AttributeError: 'RelatedManager' object has no attribute 错误。
    猜你喜欢
    • 2013-04-24
    • 2011-11-21
    • 1970-01-01
    • 2012-04-02
    • 2012-07-12
    • 2017-01-04
    • 2020-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多