Sql 按引用字段的相对增量ID

Sql 按引用字段的相对增量ID,sql,django,Sql,Django,我有一张桌子来存储某些活动的预订;有关部分是: class Reservation(models.Model): # django creates an auto-increment field "id" by default event = models.ForeignKey(Event) # Some other reservation-specific fields.. first_name = models.CharField(max_length=25

我有一张桌子来存储某些活动的预订;有关部分是:

class Reservation(models.Model):
    # django creates an auto-increment field "id" by default
    event = models.ForeignKey(Event)

    # Some other reservation-specific fields..
    first_name = models.CharField(max_length=255)
现在,我希望检索给定保留相对于同一事件的保留的顺序ID

免责声明:当然,我们假设预订从未被删除,或者它们的相对位置可能会改变

例子: 最后一列是“相对ID”,即同一事件的所有保留的序列号,没有间隔


现在,实现这一点的最佳方法是什么,而不必为每次导入手动计算相对id(我不喜欢这样)?我使用postgresql作为底层数据库,但我更愿意坚持使用django抽象层,以保持其可移植性(即没有特定于数据库的解决方案,如触发器等)。

使用
Reservation.objects.filter(event\u id=some\u event\u id)进行过滤就足够了。这将为您提供一个查询集,该查询集每次都应该具有相同的顺序。还是我在你的问题中遗漏了什么?

我讨厌总是回答自己的问题,但我用以下方法解决了这个问题:

class Reservation(models.Model):

    # ...

    def relative_id(self):
        return self.id - Reservation.objects.filter(id__lt=self.id).filter(~Q(event=self.event)).all().count()
假设从不删除保留中的记录,我们可以安全地假设“相对id”是增量id-(在此之前不属于同一事件的保留计数)


我正在考虑任何缺点,但我没有发现任何缺点。

您在
没有特定于数据库的解决方案时失去了我。
:dyeah,使用触发器太容易了:)我对您所指的相对id感到困惑。您能解释一下吗。thanxplease,对于Python中的注释,请使用
#
,而不是
/
(双斜杠表示“地板”分割)@julio.alegria是的,我回答了一个关于javascript的问题,我想我弄错了东西:)--修复了问题不是顺序本身,而是为每个预订获取一个没有“间隙”的顺序id,印在车票上。我不想每次都检索和计算每个事件的每个记录:)你要么每次都要(用一个查询)计算这些顺序ID,要么把它们存储在表中。是的,关键是:要使用哪个查询来计算这些顺序ID?:)如果您想继续使用Python,为什么不直接使用查询集
enumerate()
?如果您不存储它们,我不明白您怎么也不能计算它们。@jknupp每次我都不会检索整个保留集,这就是为什么我要在数据库端计算相对ID。如果如您所述,“保留未被删除”,则此解决方案有效。如果在另一个应用程序中删除了它们,则此解决方案可能无法按预期工作。旧的
id
值将被重用。一种替代方法是在
事件
上设置一个
整数字段
,该字段最初设置为
1
。新的预订可以将此值复制为其
id
,然后该值将递增。这需要覆盖标准的
create()
,或者编写一个信号侦听器。
class Reservation(models.Model):

    # ...

    def relative_id(self):
        return self.id - Reservation.objects.filter(id__lt=self.id).filter(~Q(event=self.event)).all().count()