每个存储库的GitHub问题ID从1开始,我如何在Django中复制它?

时间:2014-10-07 06:39:25

标签: django django-models

在Github上,尽管GitHub上还有许多其他问题,但每个存储库的第一个问题都是id 1。

https://github.com/johndoe/foo/issues/1

如何在Django中完成此操作,以便模型的id只相对于与其相关的模型递增?

2 个答案:

答案 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。问题删除很有意义。但是,如果最后一期(编号最高)被删除,那么新版本将再次分配相同的编号,作为已删除的问题。