Джанго: проблема с менеджером пользовательских моделей - PullRequest
2 голосов
/ 03 октября 2010

Я пытаюсь создать простой пользовательский менеджер, но не могу объединить пользовательские запросы:

class MyManager(models.Manager):    
def some_filter(self):        
    qs = self.get_query_set()
    return qs.filter(score__gt = 10).order_by("-score")
class Game(models.Model):    
     score = models.IntegerField(blank=True, default=0)
     objects = MyManager()


games = Game.objects.filter(any_filter).some_filter()[:5]

Но я получаю QuerySet 'объект не имеет атрибута' some_filter '

Редактировать : Похоже, вопрос в том, как объединить пользовательские функции фильтра вместе: что-то вроде games = Game.objects.some_filter1().some_filter2()[:5] просто не будет работать для меня.

Ответы [ 3 ]

4 голосов
/ 03 октября 2010

Вы можете применить some_filter () к объекту MyManager перед фильтром метода QuerySet ()

games = Game.objects.some_filter().filter(any_filter)[:5]

В противном случае вы должны добавить метод some_filter в QuerySet

3 голосов
/ 03 октября 2010

Я нашел способ сделать это. Также необходимо определить новый класс QuerySet

class GameQS(QuerySet):
    def some_filter1(self):
        return self.filter(score__gt = 10).order_by("-score")
    def some_filter2(self):
        return self.filter(score__gt = 50).order_by("-score")



class GameManager(models.Manager):
    def get_query_set(self):
        return GameQS(self.model, using=self._db)

    def some_filer1(self):
        return self.get_query_set().some_filter1()

    def some_filter2(self):
        return self.get_query_set().some_filter2()
0 голосов
/ 19 августа 2015

Если вы новичок в использовании менеджеров моделей, сначала посмотрите ответ GabiMe

Начиная с django 1.7, используйте queryset в качестве метода класса менеджера , чтобы сохранить код DRY

MyQueryset.as_manager()

Если вы используете более старые версии, см. этот вопрос , чтобы узнать, как оптимизировать код.

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