2012-08-13 37 views
1

我只是好奇的方式Django自動生成方法靈活的參數名稱,如c = p.choice_set.filter(choice_startswith = 'Just hacking') 你能解釋基本上它怎麼可以做?django如何自動生成方法?

這是例子

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 
+0

對不起。我不確定你是什麼意思。你能詳細闡述一下嗎? – 2012-08-13 20:22:10

回答

3

此的代碼是通過分析函數的關鍵字參數由字段名稱和條件分裂他們做。做一些簡化驗證的概念看起來像下一個片段:

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

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

然後使用字段名稱和條件的某些動作的真實對象完成。

1

我假設你正在討論 示例中的choice_startswith參數。本質上,這通過利用python處理關鍵字 參數起作用。這是非常簡單的魔術,我會告訴你這裏。

基本上你定義一個方法或函數與類似這樣的簽名::

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

正如你可以在這裏看到我們定義爲奇怪的看參數。然而這些 不是正常的參數。參數前面的*表示任何非關鍵字 參數將作爲元組存儲在變量args中。 kwargs前面的**在 表示任何關鍵字參數將作爲字典存儲在變量 kwargs中。

所以,如果你運行該功能是這樣的:

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

你會得到這樣的輸出:

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

可以manipluate指定參數和kwargs作爲一個元組或分別的字典。如果你分析這些,你可以做什麼Django用過濾器的方法。