Python django如何自动生成方法?

Python django如何自动生成方法?,python,django,Python,Django,我只是好奇Django如何自动生成具有灵活参数名的方法,比如c=p.choice\u set.filter(choice\u startswith='just hacking') 你能解释一下怎么做吗 这是示例的代码 import datetime from django.db import models from django.utils import timezone class Poll(models.Model): question = models.CharField(ma

我只是好奇Django如何自动生成具有灵活参数名的方法,比如
c=p.choice\u set.filter(choice\u 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

这是通过分析函数的关键字参数并按字段名和条件将其拆分来实现的。进行一些简化后,概念验证将类似于下一个片段:

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

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

然后使用字段名和条件在实际对象上执行某些操作。

这是通过分析函数的关键字参数来完成的,将它们按字段名和条件拆分。进行一些简化后,概念验证将类似于下一个片段:

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

>>> filter(choice__startswith='prefix-')
choice 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'}
您可以将args和kwargs分别组合为元组或dict。如果你
分析这些,您可以像django使用filter方法一样进行操作。

我假设您正在谈论的是您的 例子。本质上,这是通过利用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'}
您可以将args和kwargs分别组合为元组或dict。如果你
分析这些对象,您可以像django使用filter方法那样进行操作。

ForeignRelatedObjectsDescriptor类在相关字段中提供类似管理器的objectname\u集或相关名称

见:

ForeignRelatedObjectsDescriptor类在相关字段中提供类似管理器的objectname\u集或相关名称

见:

对不起。我不知道你的意思。你能详细解释一下吗?对不起。我不知道你的意思。你能详细说明一下吗?