在Github上,尽管GitHub上还有许多其他问题,但每个存储库的第一个问题都是id 1。
https://github.com/johndoe/foo/issues/1
如何在Django中完成此操作,以便模型的id只相对于与其相关的模型递增?
答案 0 :(得分:2)
您可以在模型上创建一个额外的唯一字段,这是一个示例
class MyModel(models.Model):
user = models.ForeignKey(User)
internal_id = models.CharField(verbose_name=_(u"Internal ID"), max_length=7)
@classmethod
def generate_internal_id(cls, self):
try:
# note: you could also implement 'lastest' which is more readable
return int(cls.objects.filter(user=self.user).order_by('-id')[0].id) + 1
except (IndexError, cls.DoesNotExist):
return SOME_INTERNAL_ID_OFFSET
def clean(self):
if not self.id:
self.internal_id = self.generate_internal_id()
return super(MyModel, self).clean()
答案 1 :(得分:1)
您需要为此类事物创建另一个字段。在数据库中,每一行必须在该表中的所有行中具有唯一的主键。在SQL中,可以声明复合主键,但它是not currently supported in django。
示例代码:
from django.db.models.signals import pre_save
class Repository(models.Model):
# ...
class Issue(model.Model):
number = models.IntegerField(default=1)
repo = models.ForeignKey(Repository)
# ...
class Meta:
unique_together = (('repo', 'number'),)
@classmethod
def assign_number(cls, sender, instance, **kwars):
if not instance.pk:
# Only for new instances
try:
instance.number = cls.objects.filter(repo=instance.repo)\
.order_by('-number')[0].number + 1
except IndexError:
pass
pre_save.connect(Issue.assign_number, sender=Issue)
<强>已更新强>
代码会为新创建的问题分配下一个number
。问题删除很有意义。但是,如果最后一期(编号最高)被删除,那么新版本将再次分配相同的编号,作为已删除的问题。