我有一张表来存储某些活动的预订;相关部分是:
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抽象层来保持这种可移植性(即没有特定于数据库的解决方案,如触发器等)。
答案 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 - (在此之前的预订计数不属于同一事件)。
我在考虑任何缺点,但我没有发现任何缺点。