参考字段的相对增量ID

时间:2011-12-23 17:09:41

标签: 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=255)

现在,我希望检索相对于同一事件的预订的给定预订的顺序ID。

免责声明:当然,我们假设从不删除了预订,或者他们的相对位置可能会发生变化。

实施例

+----+-------+------------+--------+
| ID | Event | First name | Rel.ID |
+----+-------+------------+--------+
|  1 |     1 | AAA        |      1 |
|  2 |     1 | BBB        |      2 |
|  3 |     2 | CCC        |      1 |
|  4 |     2 | DDD        |      2 |
|  5 |     1 | EEE        |      3 |
|  6 |     3 | FFF        |      1 |
|  7 |     1 | GGG        |      4 |
|  8 |     1 | HHH        |      5 |
+----+-------+------------+--------+

对于同一事件的所有预订,最后一列是“相对ID”,即序号,没有间隙。

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

2 个答案:

答案 0 :(得分:0)

使用Reservation.objects.filter(event_id = some_event_id)进行过滤就足够了。这将为您提供一个QuerySet,每次都应该具有相同的顺序。或者我在你的问题中遗漏了什么?

答案 1 :(得分:0)

我讨厌总是那个回答自己问题的人,但我解决了这个问题:

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 - (在此之前的预订计数不属于同一事件)。

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