gpt4 book ai didi

带有过滤器参数的Django自定义管理器

转载 作者:行者123 更新时间:2023-12-04 07:39:19 25 4
gpt4 key购买 nike

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

以下是我到目前为止的内容:

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 %}

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

例如。:

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

除了尝试从模板传递参数之外,我还尝试在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 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' object has no attribute '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_set.objects.current(my_date)

关于带有过滤器参数的Django自定义管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17778561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com