我有一个名为“数字”的字段,希望它是自动增量而且不可编辑。
我的系统有多个用户。每个用户都可以注册遵循序数序列的文档。每个用户只能创建他想要的文档,但每个文档的编号都按顺序生成,不应重复。
我尝试使用:
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()
答案 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。这样做的缺点是,如果不使用这些值,最终会出现间隙。