如何使IntegerField获得自动增量而不可编辑?

时间:2018-03-14 15:20:38

标签: django python-3.x django-views

我有一个名为“数字”的字段,希望它是自动增量而且不可编辑。

我的系统有多个用户。每个用户都可以注册遵循序数序列的文档。每个用户只能创建他想要的文档,但每个文档的编号都按顺序生成,不应重复。

我尝试使用:

number = models.IntegerField (unique = True)

但是,如果另一个用户已经使用该号码创建了一个文档,则另一个用户无法创建该文档。

class Document(models.Model):
    date = models.DateTimeField(default=timezone.now)
    responsible = models.ForeignKey(Responsible, on_delete=models.PROTECT)
    from = models.CharField(max_length=80)
    work_from = models.CharField(max_length=80)
    subject = models.CharField(max_length=80)
    text = models.TextField()
    number = models.IntegerField()

1 个答案:

答案 0 :(得分:1)

您可以使用unique_together允许不同的用户拥有相同的number

class Document(models.Model):
    ...
    class Meta:
        unique_together = [('responsible', 'number'),]

使数字增加的最佳方法取决于您使用的数据库。最简单的解决方案是获取最后一个数字:

last_document = Document.objects.filter(responsible=responsible).order_by('number').last()

如果返回文档,则可以在编号中添加一个文档。如果同一用户一次创建多个文档,则这具有竞争条件的缺点。

像PostgreSQL这样的数据库允许你create sequences。这样做的缺点是,如果不使用这些值,最终会出现间隙。