пользовательский менеджер django с параметром фильтра

Я хотел бы добавить пользовательский менеджер, который может быть вызван из шаблона, но не влияет на всю модель (например, вид администратора) и который слушает набор параметров в запросе (имя_пользователя).

вот что у меня пока есть:

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, но также может быть в других случаях.

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

принятый ответ работает, по крайней мере, одна связь.
В случае более вложенной модели данных этот метод, похоже, не дает ожидаемых результатов:

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'.

1 ответов


Я бы упростил его:

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)

а затем просто передайте шаблон как отфильтрованные объекты, обращающиеся к ним с помощью этого:

{% for b in b_objects %}

надеюсь, что это помогает!

Edit (по запросу):

мне пришлось настроить его так, чтобы заставить его работать:

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)