Python将参数传递给可调用函数引用

时间:2017-01-20 17:33:05

标签: python django python-3.x

我不确定我是否以最好的方式提出这个问题但是,在Django中,我们的模型字段可以有一个默认值,可以是一个函数

示例:(是的,我知道它在上下文中没有意义,我知道我可以扩展基类/覆盖保存方法)

class MyModel(models.Model):
    #How do i pass an argument without calling it
    model_name = models.IntegerField(default=my_func)


def my_func(model):
    return model.__name__

这会导致错误,因为my_func需要模型参数,但是我不能在默认情况下调用它,因为它需要一个函数引用并稍后调用它。

可以用Python完成吗?

编辑:经过一些研究,我用lambda想出了这个,不确定逻辑是否正确,对我来说看起来很神奇

def auto_field(model):
    last_id = model.objects.latest('cod')
    if last_id is not None:
        return last_id + 1
    return 1

class MyModel(models.Model):
    uid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    cod = models.IntegerField(default=lambda: auto_field(self), editable=False, unique=True)

顺便说一句,Django的AutoField有一个限制,它必须是主键

1 个答案:

答案 0 :(得分:1)

您也可以从AutoField继承并通过覆盖_check_primary_key方法来避免对check的调用。

class MyAutoField(models.AutoField):
    def check(self, **kwargs):
        errors = models.Field.check(**kwargs)
        # errors.extend(self._check_primary_key())
        return errors

class MyModel(models.Model):
    uid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    cod = MyAutoField(editable=False, unique=True)