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

时间:2015-11-04 14:47:45

标签: python django django-models django-orm

我有以下两个模型(仅用于测试):

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 Admin站点创建一个新的测试数据集元素。我所期望的(也许我在这里错了)是,在将新数据集保存到数据库时,方法Generator.get_id()只被调用一次。但真正发生的是,Generator.get_id()方法被调用三次:

  • 第一次点击"添加测试数据集"管理区域中的按钮
  • 在此之后不久的第二次(没有来自用户的额外互动)
  • 第三次最终保存新数据集

第一次可能没问题:这将是预先填写在表单字段中的值。由于主键字段未显示在我的表单中,因此这可能是不必要的调用。

第三次也很清楚:在保存之前已经完成了。当它真正需要 时。

上面的代码只是一个例子,对我来说是一个测试。在实际项目中,我不得不向远程系统询问ID而不是其他表模型。但每当我查询该系统时,交付的ID都会被锁定 - 就像get_id_for_table()方法计数一样。

我确信有更好的方法可以在方法中仅在真正需要时获取ID - 在插入新数据集时应该只调用一次方法。知道如何实现这个目标吗?

忘记版本:它是Python 3.4上的Django 1.8.5。

1 个答案:

答案 0 :(得分:0)

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

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