django如何自动生成方法?

时间:2012-08-13 20:14:10

标签: python django

我只是好奇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

3 个答案:

答案 0 :(得分:3)

这是通过分析函数的关键字参数来完成的,这些参数按字段名称和条件分割它们。简化概念验证将看起来像下一个片段:

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

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

然后使用字段名称和条件,对真实对象执行某些操作。

答案 1 :(得分:1)

我假设你正在谈论你的select_startswith参数 例。基本上这是通过利用python对关键字的处理来实现的 参数。这是非常简单的魔法,我会告诉你。

基本上,您使用类似于此::

的签名定义方法或函数
def somefunc(*args, **kwargs):
    print args
    print kwargs

正如你在这里看到的,我们定义了奇怪的观点。然而这些 不是正常的论点。 args前面的*表示任何非关键字 参数将作为元组存储在变量args中。 **中的kwargs kwargs前面意味着任何关键字参数都将存储在变量中 >>> somefunc('a', 'b', alpha='alpha', beta='beta') 作为一个词。

所以如果你像这样运行这个函数:

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

你会得到这个输出:

{{1}}

你可以分别将args和kwargs作为一个元组或一个dict来操纵。如果你 分析这些你可以做django用过滤方法做的事情。

答案 2 :(得分:0)

ForeignRelatedObjectsDescriptor类在相关字段中提供类似objectname_set或related_name的管理器

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