我不确定我是否以最好的方式提出这个问题但是,在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有一个限制,它必须是主键
答案 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)