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