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

Python将参数传递给可调用函数引用,python,django,python-3.x,Python,Django,Python 3.x,我不确定我是否用最好的方式表达了这个问题,但是在Django中,我们的模型字段可以有一个默认值,它可以是一个函数 示例:(是的,我知道它在上下文中毫无意义,我知道我可以扩展基类/覆盖save方法) 这将导致一个错误,因为my_func需要模型参数,但我无法在默认情况下调用它,因为它需要函数引用,稍后将调用它 这可以用Python实现吗 编辑:经过进一步研究,我用lambda得出了这个结论,不确定逻辑是否正确,对我来说它看起来很神奇 def auto_field(model): last_

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

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

这将导致一个错误,因为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有一个限制,即它必须是主键

您也可以从AutoField继承,并通过重写
check
方法避免调用
\u check\u primary\u key

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)

Callables不接受任何参数。如果你能解释一下你真正想做什么,也许我们可以建议一个解决办法。@CésargaríaTapia自动递增非主字段,我编辑了一个我提出的示例,不确定逻辑是否正确,但是,你不能将lambda用作可调用项,因为它们不能通过迁移序列化。如果重写save方法,则应在要从中继承的超类中执行,因为您希望在多个模型中使用save方法no,请查阅python继承。注释并不是解释它的最佳地方这必须是最优雅的解决方案SQL数据库通常不允许您使用多个自动递增字段,因此djangorestriction@yuumiesuuid不应该有问题,因为它是用python计算的,如果已经定义了主键,那么限制也不应该存在,只有一个auto_字段这有一个问题,即使我在参数中设置primary_key=false,它仍然试图在数据库中创建一个primary_键,某些内容正在覆盖它一些常见的内容,请参见auto_increment。我认为您可以在postgresql上完成,尽管我相信您必须手动编写查询
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)