django自定义管理器带过滤参数 [英] django custom manager with filter parameter

查看:228
本文介绍了django自定义管理器带过滤参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想添加一个可以从模板调用的自定义管理器,但不会影响整个模型(例如管理员视图),哪些监听请求中设置的参数(user_profile)。



以下是我到目前为止:



models.py:




def current(self):
return self.filter(id = 1)##这个简化的过滤器测试工作..
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 a in a.b_set.current%} 

但是,一旦我尝试将参数传递给该过滤器(在这种情况下,存储在用户配置文件中的日期),该方法不会返回任何结果。



例如:



models.py

  class CurrentQuerySet(models.query.QuerySet):
def current(self,my_date):
return self.filter(valid_from__lte = my_date)
pre>

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))
pre>

我在哪里缺少(或误会)哪一部分?



谢谢



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) :
返回self.b



Edit-2



接受的答案至少可以用于一个关系。

如果有更嵌套的数据模型,这种方法似乎没有提供预期的结果:



models.py

  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从')
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 '

解决方案

我会简化:

 code class 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 )

然后只将传递给模板作为使用以下访问它们的过滤对象:

  {b_objects中的b为%} 

希望这有帮助!



编辑(请求者):



我必须按照以下方法进行调整工作:

  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_set.objects.current(my_date)


I would like to add a custom manager which can be called from a template, but does not affect the entire model (e.g. admin views) and which listens to a parameter set in the request (user_profile).

The following is what I have so far:

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)

For model B is defined:

    objects = CurrentManager()

The template calls:

{% for b in a.b_set.current %}

But as soon as I try to pass a parameter to that filter (in this case a date stored on the user-profile) the method does not return any results.

e.g.:

models.py

class CurrentQuerySet(models.query.QuerySet):
    def current(self,my_date): 
            return self.filter(valid_from__lte=my_date) 

showA.html

{% for b in a.b_set.current(request.user.get_profile.my_date) %}

Instead of passing the parameter from the template, I have also tried to set this in the 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))

Which part am I missing (or misunderstanding) here?

Thanks

R

Edit

Here the models. As mentioned, in this example it's a simple 1:n relationship, but can also be m:n in other cases.

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

Edit-2

The accepted answer works for at least one relationship.
In case of a more nested data model, this method seems not to deliver the expected results:

models.py

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))

This returns the error: 'QuerySet' object has no attribute 'c_set'

解决方案

I'd simplify it:

class CurrentManager(models.Manager):
    def current(self, my_date):
        return super(CurrentManager, self).get_query_set().filter(valid_from__lte=my_date) 

and then use it like this:

a = A.objects.get(id=a_id)
my_date = request.user.get_profile().my_date
b_objects = a.b_set.objects.current(my_date)

and then just pass a to the template as the filtered objects accessing them using this:

{% for b in b_objects %}

Hope this helps!

Edit (by requestor):

I had to adjust it as follows to get it working:

a = A.objects.get(id=a_id)
my_date = request.user.get_profile().my_date
b_objects = a.b_set.current(my_date)

This threw an error: "'RelatedManager' object has no attribute 'objects'"

a.b_set.objects.current(my_date)

这篇关于django自定义管理器带过滤参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆