2016-09-01 13 views
0

私は自分のモデルでカスタムマネージャーを使用しようとしていますが、それも自己関係で使用したいので、いくつかのコードをaddメソッドに追加できます。ラインt1.children.add(t2)自分自身の多人数一人のマネージャーにカスタム

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シェル出力

>>> 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>]> 
>>> 

なぜそれが「私のカスタムコード」を印刷しませんでした。ここでは、コードですか?

答えて

0

私の答えは、ソースコードを熟読しています。 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. 
    """ 
関連する問題