我目前有这些到utils函数。 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
答案 0 :(得分:1)
不确定我理解这个问题,因为答案非常简单:
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
答案 1 :(得分:0)
我想在评论中回答你的问题。由于评论部分不允许太多文本,我想将此作为对已接受答案的补充。
**{_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)
因为它被“翻译”为
example(a = 1, c = 2)
并且该函数没有名称为c
的参数