Задача менеджера объектов Django - PullRequest
1 голос
/ 24 июня 2009

Итак, вот вопрос для мастера Django. Я наследую менеджер объектов что-то вроде следующего:

class MyObjManager(models.Manager):

    def total_values(self, myobj_id):
                return 49

    def what_the_heck(self, poll_id):
                return 48

class TestMe():

        def what_the_heck(self, poll_id):
               return 47

Теперь, если я создам модель, которая использует этот диспетчер объектов, как показано ниже, она, похоже, не будет работать.

class MyObj(models.Model):
    x = models.CharField(max_length=200)
    y = models.DateTimeField('date published')
    objects = MyObjManager()
    kb = MyObjManager()
    testMe = TestMe()

    def total_values(self):     
        #A return self.objects.total_values(1)
            #B return self.objects.yyy(1) 
            #C return self.kb.what_the_heck(1)
            #D return 50
            #E return self.testMe.what_the_heck(1)
            #F return self.objects.what_the_heck(1)

Теперь предположим, что A, B, C, D, E закомментированы по одному соответственно. Вот результаты, если я позвоню myObj.total_values. (где myObj является экземпляром MyObj) А) ничего Б) ничего В) ничего D) 50 Е) 47 F) Ничего

Я использовал два менеджера объектов в этом примере, но то же самое происходит, если я использую только один. Любое понимание того, почему я не могу получить доступ к методам в моем переопределенном диспетчере объектов?

Ответы [ 2 ]

3 голосов
/ 24 июня 2009

Для A, B и C вы не можете использовать self ... это метод экземпляра, а self ссылается на тот экземпляр ... у которого экземпляр не имеет методов менеджера.

E и F работают, потому что вы снова вызываете методы экземпляра, для которых вы правильно объявили атрибуты.

Для A, B, C замените себя на MyObj

class MyObj(models.Model):
    x = models.CharField(max_length=200)
    y = models.DateTimeField('date published')
    objects = MyObjManager()
    kb = MyObjManager()
    testMe = TestMe()

    def total_values(self):             
        #A return MyObj.objects.total_values(1)
        #B return MyObj.objects.yyy(1) 
        #C return MyObj.kb.what_the_heck(1)
        #D return 50
        #E return self.testMe.what_the_heck(1)
        #F return self.objects.what_the_heck(1)

Мне трудно придумать сценарий, в котором вы найдете экземпляр модели, а затем вызовете функцию для этого, чтобы получить другие экземпляры этой модели, хотя ... (Я полагаю, что ваш подход может быть неуклюжим или неправильным, если вы решите, что проблема с большим объемом может помочь вам получить лучший ответ.)

0 голосов
/ 24 июня 2009

Неясно, действительно ли PollManager наследуется от MyObjManager. Вы хотите позвонить в свой класс PollManager?

РЕДАКТИРОВАТЬ: Вы можете попробовать создать конструктор для MyObjManager. Это вызвало бы конструктор менеджера.

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

Посмотрите, работает ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...