【问题标题】:How do I make an IntegerField get autoincrement and not editable?如何使 IntegerField 自动递增且不可编辑?
【发布时间】:2018-03-14 15:20:37
【问题描述】:

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

我的系统有多个用户。每个用户都可以注册一个按顺序排列的文档。每个用户只能创建任意数量的文档,但每个文档的编号都是按顺序生成的,绝对不能重复。

我尝试使用:

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()

【问题讨论】:

  • 只是一个简短的旁注:您不能使用语言关键字 (from) 作为字段名称。

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


【解决方案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。这样做的缺点是,如果不使用这些值,最终可能会出现间隙。

【讨论】:

  • 只要在数据库级别强制执行约束,竞争条件应该是可以容忍的。只需从 django 捕获完整性错误并重试。如果允许间隙,我仍然会选择一个序列。
  • 成功了。但是,它返回完整性错误。如何处理此错误,以便在表单屏幕上显示消息?
  • 在 try except 块中捕获完整性错误。我不能更具体,因为您没有显示给出错误的代码。
  • 这是错误:唯一约束失败:oficio_oficio.responsavel_id, oficio_oficio.numero
猜你喜欢
  • 2019-03-21
  • 2016-03-07
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多