Django:Filter&函数

时间:2018-03-27 21:19:55

标签: django models

我目前有这些到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

2 个答案:

答案 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

的参数