Джанго Менеджеры или лучший план - PullRequest
1 голос
/ 18 февраля 2012

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

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

Спасибо за внимание !!

--- models.py

class Subdivision(models.Model):
    objects = SubdivisionManager()

--- Manager.py

class SubdivisionManager(models.Manager):
    """A generic manager with metros"""


    def is_metro_sample_eligible(self, subdivision_id):
        """Are we eligible for sampling taking into account the 90 day windows"""
        from .models import Subdivision
        subdivision = Subdivision.objects.get(id=subdivision_id)
        return True


    def get_available_subdivisions(self, subdivision_id):
        """Return all potential subdivisions for a builder in a metro"""
        from .models import Subdivision
        subdivision = Subdivision.objects.get(id=subdivision_id)
        return self.filter(builder_org=subdivision.builder_org,
                           metro=subdivision.metro)

    def get_available_sampling_subdivisions(self, subdivision_id):
        """Return Subdivision which are able to participate in metro sampling"""
        from .models import Subdivision
        subdivision = Subdivision.objects.get(id=subdivision_id)
        return self.filter(builder_org=subdivision.builder_org,
                           metro=subdivision.metro,
                           use_sampling = True,
                           use_metro_sampling = True)

1 Ответ

1 голос
/ 18 февраля 2012

На самом деле, я бы поставил is_metro_sample_eligible() на Subdivision, поскольку каждый вызов должен иметь доступ к экземпляру.

class Subdivision(models.Model):
    def is_metro_sample_eligible(self):
        """Are we eligible for sampling taking into account the 90 day windows"""
        #TODO do something useful here and return true or false
        return True

А затем я бы либо переместил get_available_subdivisions() и get_available_sampling_subdivisions() навашу builder_org модель

from .models import Subdivision

class BuilderOrg(models.Model):
    #whatever you have goes here
    def get_available_subdivisions(self, metro):
        """Return all potential subdivisions for a builder in a metro"""
        return Subdivision.objects.filter(builder_org=self,
                                          metro=metro)

    def get_available_sampling_subdivisions(self, metro):
        """Return Subdivision which are able to participate in metro sampling"""
        return Subdivision.objects.filter(builder_org=self,
                                          metro=metro,
                                          use_sampling = True,
                                          use_metro_sampling = True)

или оставьте ее на менеджере и измените подпись на get_available_subdivisions(self, builder_org, metro).

Обоснование - я мог бы представить, что мне нужно позвонить get_available_subdivisions(), фактическиSubdivision уже имеется в виду - очевидно, важная информация - это организация строителей и метро.

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