自定义多对一经理

Posted

技术标签:

【中文标题】自定义多对一经理【英文标题】:Custom many to one manager on self 【发布时间】:2017-01-09 21:00:06 【问题描述】:

我正在尝试在我的模型上使用自定义管理器,但希望它也用于自我关系中,因此我可以向 add 方法添加一些代码。代码如下:

from django.db import models

class TestModelManager(models.Manager):

    use_for_related_fields = True

    def __init__(self):
        models.Manager.__init__(self)

    def add(self, *args, **kwargs):
        print('My custom code.')
        super().add(*args, **kwargs)

class TestModel(models.Model):

    objects = TestModelManager()

    name = models.CharField(max_length=50)
    parent = models.ForeignKey(
        'self',
        related_name='children',
        null=True,
        blank=True,
    )

Python shell 输出

>>> from testmods.models import TestModel
>>> TestModel.objects
<testmods.models.TestModelManager object at 0x10bc96e80>
>>> TestModel.objects.bulk_create([TestModel(name="foo"), TestModel(name="bar")])
[<TestModel: TestModel object>, <TestModel: TestModel object>]
>>> t1, t2 = TestModel.objects.all()
>>> t1.children.add(t2)
>>> t1.children.all()
<QuerySet [<TestModel: TestModel object>]>
>>> 

t1.children.add(t2) 行中为什么不打印“我的自定义代码。”?

【问题讨论】:

【参考方案1】:

我发现我的答案是仔细阅读源代码。看来add方法是添加到自定义管理器中的,不能在上述方法中修改。

def create_reverse_many_to_one_manager(superclass, rel):
    """
    Create a manager for the reverse side of a many-to-one relation.
    This manager subclasses another manager, generally the default manager of
    the related model, and adds behaviors specific to many-to-one relations.
    """

【讨论】:

以上是关于自定义多对一经理的主要内容,如果未能解决你的问题,请参考以下文章

resultMap自定义映射(多对一)

在 tensorflow 2 中训练自定义多对一 RNN

mybatis--自定义结果集(一对多/多对一)

spring-boot-mybatis-plus-layui 自定义代码生成完整多对一

spring-boot-mybatis-plus-layui 自定义代码生成完整多对一

关联查询 一对多,多对一,多对多,自关联