带有筛选器参数的django自定义管理器

带有筛选器参数的django自定义管理器,django,django-models,django-views,django-managers,Django,Django Models,Django Views,Django Managers,我想添加一个自定义管理器,该管理器可以从模板中调用,但不会影响整个模型(例如管理视图),并侦听请求(用户配置文件)中的参数集 以下是我目前掌握的情况: models.py: class CurrentQuerySet(models.query.QuerySet): def current(self): return self.filter(id=1) ## this simplified filter test works.. class CurrentManag

我想添加一个自定义管理器,该管理器可以从模板中调用,但不会影响整个模型(例如管理视图),并侦听请求(用户配置文件)中的参数集

以下是我目前掌握的情况:

models.py:

class CurrentQuerySet(models.query.QuerySet):
    def current(self):
            return self.filter(id=1) ## this simplified filter test works..
class CurrentManager(models.Manager):
    use_for_related_fields = True
    def get_query_set(self):
            return CurrentQuerySet(self.model)
    def current(self, *args, **kwargs):
            return self.get_query_set().current(*args, **kwargs)
对于模型B,定义如下:

    objects = CurrentManager()
模板调用:

{% for b in a.b_set.current %}
但只要我尝试将参数传递给该过滤器(在本例中是存储在用户配置文件上的日期),该方法就不会返回任何结果

e、 g:

models.py

class CurrentQuerySet(models.query.QuerySet):
    def current(self,my_date): 
            return self.filter(valid_from__lte=my_date) 
class C(models.Model):
    objects = CurrentManager()
    b = models.ForeignKey(A)
    c = models.CharField(max_length=200)
    description = models.TextField(null=True,blank=True)
    valid_from = models.DateField('valid from')
    valid_to = models.DateField('valid to',null=True,blank=True)
    def __unicode__(self):
            return self.c
showA.html

{% for b in a.b_set.current(request.user.get_profile.my_date) %}
我没有从模板中传递参数,而是尝试在view.py中进行设置

@login_required
def showA(request,a_id):
    my_date = request.user.get_profile().my_date
    a = A.objects.get(id=a_id)
    t = loader.get_template('myapp/showA.html')
    c = RequestContext(request,{'a':a,'my_date':my_date,})
    return HttpResponse(t.render(c))
我在这里遗漏了(或误解了)哪一部分

谢谢

R

编辑 这是模型。如前所述,在本例中,它是一个简单的1:n关系,但在其他情况下也可以是m:n

class A(models.Model):
    #objects = CurrentManager()
    a = models.CharField(max_length=200)
    description = models.TextField(null=True,blank=True)
    valid_from = models.DateField('valid from')
    valid_to = models.DateField('valid to',null=True,blank=True)
    def __unicode__(self):
            return self.a

class B(models.Model):
    #objects = models.Manager()
    objects = CurrentManager()
    a = models.ForeignKey(A)
    b = models.CharField(max_length=200)
    screenshot = models.ManyToManyField("Screenshot",through="ScreenshotToB")
    description = models.TextField(null=True,blank=True)
    valid_from = models.DateField('valid from')
    valid_to = models.DateField('valid to',null=True,blank=True)
    def __unicode__(self):
            return self.b
编辑-2 接受的答案至少适用于一种关系。
在嵌套数据模型较多的情况下,此方法似乎无法提供预期的结果:

models.py

class CurrentQuerySet(models.query.QuerySet):
    def current(self,my_date): 
            return self.filter(valid_from__lte=my_date) 
class C(models.Model):
    objects = CurrentManager()
    b = models.ForeignKey(A)
    c = models.CharField(max_length=200)
    description = models.TextField(null=True,blank=True)
    valid_from = models.DateField('valid from')
    valid_to = models.DateField('valid to',null=True,blank=True)
    def __unicode__(self):
            return self.c
views.py

@login_required
def showA(request,a_id):
    a = A.objects.get(id=a_id)
    my_date = request.user.get_profile().my_date
    b_objects = a.b_set.current(my_date)
    c_objects = b_objects.c_set.current(my_date)
    t = loader.get_template('controltool2/showA.html')
    c = RequestContext(request,{'a':a,'b_objects':b_objects,'c_objects':c_objects,})
    return HttpResponse(t.render(c))
这将返回错误:
'QuerySet'对象没有属性'c_set'

我将简化它:

class CurrentManager(models.Manager):
    def current(self, my_date):
        return super(CurrentManager, self).get_query_set().filter(valid_from__lte=my_date) 
然后像这样使用它:

a = A.objects.get(id=a_id)
my_date = request.user.get_profile().my_date
b_objects = a.b_set.objects.current(my_date)
然后只需将a传递给模板,作为过滤对象使用以下方法访问它们:

{% for b in b_objects %}
希望这有帮助

编辑(由请求者): 我必须按如下方式调整它以使其正常工作:

a = A.objects.get(id=a_id)
my_date = request.user.get_profile().my_date
b_objects = a.b_set.current(my_date)
这引发了一个错误:“'RelatedManager'对象没有属性'objects'”


嗨,谢谢你的简化。也许我应该更清楚,有两个模型,模型A和模型B(在本例中为1:n)。这就是为什么我要做a
a=a.objects.get(id=a\u id)
然后
{%for a.b\u set.current%}
。我将如何应用此功能?在视图中,到目前为止我只接触了一个。你能在这里包括这两个模型以更好地帮助你吗?嗨,你现在可以在底部找到模型。期待着您的意见,我每天晚上都会在这里闲逛近一个星期了。:-)看看我更新后的回复,看看这是否有助于你回到正轨谢谢,你更新后的回复很有效(在一个小小的修正之后)。当然,我会把你的回答写成“接受”。但这个解决方案似乎只适用于一组。我的真实模型更加嵌套(B有许多C),在那里它似乎不起作用(见原始帖子的编辑-2)