我刚刚接触到Django Managers,我发现自己在做这种类型的编程。我想看看有没有办法去掉那些明显的重复。我认为我需要定义使用get_query_set来指代我自己?
在我的问题上说得很清楚。为了找出要过滤的行,我必须反复传入细分。我想有一种更简单的方法,我只是不确定它是什么。
感谢您的关注!
- models.py
class Subdivision(models.Model):
objects = SubdivisionManager()- managers.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)发布于 2012-02-18 13:36:41
实际上,我将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 -显然,重要的信息是构建者组织和metro。
https://stackoverflow.com/questions/9338553
复制相似问题