Django:过滤器和功能
Django: Filter & function
我目前有这些实用程序功能。
unique_account_link_generator 和 unique_order_id 之间的唯一区别是它们在 qs_exists 中过滤的内容。它是 .filter(slug=new_id) 或 .filter(order_id=new_id)
我现在想知道有没有一种方法可以将它们组合起来,然后在调用函数时能够定义过滤方法:unique_id_generator(instance, _filter = "order_id")
import random
import string
def random_string_generator(size=10, chars=string.ascii_lowercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
def unique_account_link_generator(instance):
"""
1. Generates random string
2. Check if string unique in database
3. If already exists, generate new string
"""
new_id = random_string_generator()
myClass = instance.__class__
qs_exists = myClass.objects.filter(slug=new_id).exists()
if qs_exists:
return unique_account_link_generator(instance)
return new_id
# How to send field_name via function?
def unique_id_generator(instance):
"""
1. Generates random string
2. Check if string unique in database
3. If already exists, generate new string
"""
new_id = random_string_generator()
myClass = instance.__class__
qs_exists = myClass.objects.filter(order_id=new_id).exists()
if qs_exists:
return unique_id_generator(instance)
return new_id
不确定我是否理解问题,因为答案很简单:
def unique_id_generator(instance, _filter="order_id"):
new_id = random_string_generator()
myClass = instance.__class__
qs_exists = myClass.objects.filter(**{_filter:new_id}).exists()
if qs_exists:
return unique_id_generator(instance, _filter)
return new_id
我想在评论中回答你的问题。由于评论部分不允许太多文字,我想将其附加到已接受的答案中。
实际上 **{_filter:new_id}
将解压 _filter 参数中的内容是正确的
如果你用(instance, _filter="order_id")
调用函数
这部分 **{_filter:new_id}
看起来像这样 **{"order_id":"randomGeneratedCode123"}
现在你有了一个字典,键为 "order_id"
,值为 "randomGeneratedCode123"
您的目标是将键 "order_id" 转换为参数名称,将 "order_id" 键的值转换为参数 order_id
的值
order_id = "randomGeneratedCode123"
正如你已经说过的,你可以用双星解压字典**
解压后,字典中的键就是你的参数名,键的值就是参数值
为了更好的理解,这里有一个小例子:
假设你有一本字典和一个函数
dict = {'a': 1, 'b': 2}
def example(a, b):
print("Variable a is {}, b is {}".format(a, b))
example(**dict)
**dict
转换为:
a = 1, b = 2
所以函数将被调用
example(a = 1, b = 2)
字典中的键必须与函数参数名称同名,这一点很重要
所以这行不通:
dict = {'a': 1, 'c': 2}
example(**dict)
因为它 "translated " 和
example(a = 1, c = 2)
并且该函数没有名为 c
的参数
我目前有这些实用程序功能。 unique_account_link_generator 和 unique_order_id 之间的唯一区别是它们在 qs_exists 中过滤的内容。它是 .filter(slug=new_id) 或 .filter(order_id=new_id)
我现在想知道有没有一种方法可以将它们组合起来,然后在调用函数时能够定义过滤方法:unique_id_generator(instance, _filter = "order_id")
import random
import string
def random_string_generator(size=10, chars=string.ascii_lowercase + string.digits):
return ''.join(random.choice(chars) for _ in range(size))
def unique_account_link_generator(instance):
"""
1. Generates random string
2. Check if string unique in database
3. If already exists, generate new string
"""
new_id = random_string_generator()
myClass = instance.__class__
qs_exists = myClass.objects.filter(slug=new_id).exists()
if qs_exists:
return unique_account_link_generator(instance)
return new_id
# How to send field_name via function?
def unique_id_generator(instance):
"""
1. Generates random string
2. Check if string unique in database
3. If already exists, generate new string
"""
new_id = random_string_generator()
myClass = instance.__class__
qs_exists = myClass.objects.filter(order_id=new_id).exists()
if qs_exists:
return unique_id_generator(instance)
return new_id
不确定我是否理解问题,因为答案很简单:
def unique_id_generator(instance, _filter="order_id"):
new_id = random_string_generator()
myClass = instance.__class__
qs_exists = myClass.objects.filter(**{_filter:new_id}).exists()
if qs_exists:
return unique_id_generator(instance, _filter)
return new_id
我想在评论中回答你的问题。由于评论部分不允许太多文字,我想将其附加到已接受的答案中。
实际上 **{_filter:new_id}
将解压 _filter 参数中的内容是正确的
如果你用(instance, _filter="order_id")
这部分 **{_filter:new_id}
看起来像这样 **{"order_id":"randomGeneratedCode123"}
现在你有了一个字典,键为 "order_id"
,值为 "randomGeneratedCode123"
您的目标是将键 "order_id" 转换为参数名称,将 "order_id" 键的值转换为参数 order_id
的值order_id = "randomGeneratedCode123"
正如你已经说过的,你可以用双星解压字典**
解压后,字典中的键就是你的参数名,键的值就是参数值
为了更好的理解,这里有一个小例子:
假设你有一本字典和一个函数
dict = {'a': 1, 'b': 2}
def example(a, b):
print("Variable a is {}, b is {}".format(a, b))
example(**dict)
**dict
转换为:
a = 1, b = 2
所以函数将被调用
example(a = 1, b = 2)
字典中的键必须与函数参数名称同名,这一点很重要
所以这行不通:
dict = {'a': 1, 'c': 2}
example(**dict)
因为它 "translated " 和
example(a = 1, c = 2)
并且该函数没有名为 c
的参数