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

的参数