1

Django が柔軟なパラメーター名を使用してメソッドを自動的に生成する方法に興味がありc = p.choice_set.filter(choice_startswith = 'Just hacking') ます。

これは例のコードです

 import datetime
from django.db import models
from django.utils import timezone

class Poll(models.Model):
    question = models.CharField(max_length = 200)
    pub_date = models.DateTimeField('date published')
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days = 1)

    def __unicode__(self):
        return self.question

class Choice(models.Model):
    poll = models.ForeignKey(Poll)
    choice = models.CharField(max_length = 200)
    votes = models.IntegerField()
    def __unicode__(self):
        return self.choice
4

3 に答える 3

3

これは、関数のキーワード引数をフィールド名と条件で分割して分析することによって行われます。いくつかの単純化を行うと、概念実証は次のスニペットのようになります。

def filter(**kwargs):
    for i in kwargs:
        field, condition = i.split('__')
        print field, condition

>>> filter(choice__startswith='prefix-')
choice startswith

次に、フィールド名と条件を使用して、特定のアクションが実際のオブジェクトに対して実行されます。

于 2012-08-13T20:25:12.143 に答える
1

例では、choice_startswithパラメーターについて話していると想定しています。基本的に、これはPythonのキーワード引数の処理を利用することで機能します。行うのは非常に簡単な魔法です。ここで紹介します。

基本的に、次のようなシグネチャを使用してメソッドまたは関数を定義します。

def somefunc(*args, **kwargs):
    print args
    print kwargs

ここでわかるように、奇妙に見える引数を定義しました。ただし、これらは通常の引数ではありません。argsの*前にあるということは、キーワード以外の引数がargsタプルとして変数に格納されることを意味します。kwargsの**前にあるということは、キーワード引数が kwargsdictとして変数に格納されることを意味します。

したがって、この関数を次のように実行すると、次のようになります。

>>> somefunc('a', 'b', alpha='alpha', beta='beta')

次の出力が得られます。

>>> ('a', 'b')
>>> {'alpha': 'alpha', 'beta': 'beta'}

argsとkwargsをそれぞれタプルまたはdictとして操作できます。これらを分析すると、djangoがfilterメソッドで行うことを実行できます。

于 2012-08-13T20:26:47.480 に答える
0

ForeignRelatedObjectsDescriptorクラスは、関連フィールドにobjectname_setやrelated_nameのようなマネージャーを提供します

参照: https ://github.com/django/django/blob/master/django/db/models/fields/related.py#L433

于 2012-08-13T20:41:20.367 に答える