10

テンプレートから呼び出すことはできるが、モデル全体 (管理ビューなど) には影響せず、リクエストで設定されたパラメーター (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

受け入れられた回答は、少なくとも 1 つの関係で機能します。
よりネストされたデータ モデルの場合、この方法では期待どおりの結果が得られないようです。

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

ビュー.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'

4

1 に答える 1

10

私はそれを単純化します:

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)
于 2013-07-22T03:30:52.390 に答える