Django Model:多次调用字段的默认方法

2024-10-02 04:31:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下两种型号(仅供测试):

class IdGeneratorModel(models.Model):

    table = models.CharField(primary_key=True, unique=True,
                             null=False, max_length=32)
    last_created_id = models.BigIntegerField(default=0, null=False,
                                             unique=False)

    @staticmethod
    def get_id_for_table(table: str) -> int:
        try:
            last_id_set = IdGeneratorModel.objects.get(table=table)
            new_id = last_id_set.last_created_id + 1
            last_id_set.last_created_id = new_id
            last_id_set.save()
            return new_id
        except IdGeneratorModel.DoesNotExist:
            np = IdGeneratorModel()
            np.table = table
            np.save()
            return IdGeneratorModel.get_id_for_table(table)

class TestDataModel(models.Model):

    class Generator:
        @staticmethod
        def get_id():
            return IdGeneratorModel.get_id_for_table('TestDataModel')

    id = models.BigIntegerField(null=False, primary_key=True,
                                editable=False, auto_created=True,
                                default=Generator.get_id)
    data = models.CharField(max_length=16)

现在我使用普通的Django管理站点来创建一个新的测试数据集元素。我所期望的(也许我错了)是,在将新数据集保存到数据库时,Generator.get_id()方法只被调用一次。但实际发生的是,Generator.get_id()方法被调用了三次:

  • 当我第一次在管理区域点击“添加测试数据集”按钮时
  • 之后不久的第二次(用户端没有额外的交互)
  • 第三次保存新的数据集

第一次可以确定:这是表单字段中预先填充的值。由于主键字段没有显示在我的表单中,这可能是一个不必要的调用。在

第三次也是很清楚的:这是在储蓄之前完成的。当真正需要的时候。在

上面的代码只是一个例子,对我来说是一个测试。在实际的项目中,我必须向远程系统请求一个ID,而不是从另一个表模型获得ID。但是每当我查询该系统时,传递的ID就会被锁定在那里,就像get_id_for_table()方法的计数一样。在

我确信只有在真正需要的时候,才有更好的方法从方法中获取ID,方法应该只调用一次,当插入新的数据集时。有什么办法吗?在

忘了版本了:它是python3.4上的django1.8.5。在


Tags: 方法idfalsetrueforgetmodelstable
1条回答
网友
1楼 · 发布于 2024-10-02 04:31:34

这不是您问题的答案,但可能是您问题的解决方案

我认为这个问题很复杂。尤其是因为您需要一个跨越webservice调用和数据库插入的事务。。。在这种情况下,我将使用:在本地生成一个uuid。实际上,这个值在4d世界(时间+位置)中是唯一的,并将其用作id。稍后,保存完成后,与远程服务同步。在

相关问题 更多 >

    热门问题