Относительный инкрементный идентификатор по полю ссылки - PullRequest
4 голосов
/ 23 декабря 2011

У меня есть таблица для хранения бронирований на определенные события; соответствующая его часть:

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 | 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 |
+----+-------+------------+--------+

Последний столбец - это «Относительный идентификатор», то есть порядковый номер без пробелов для всех резервирований одного и того же события.

Теперь, каков наилучший способ сделать это без необходимости вручную вычислять относительный идентификатор для каждого импорта (мне это не нравится)? Я использую postgresql в качестве основной базы данных, но я бы предпочел придерживаться уровня абстракции django, чтобы сохранить его переносимым (то есть никаких решений для конкретной базы данных, таких как триггеры и т. Д.).

Ответы [ 2 ]

0 голосов
/ 24 декабря 2011

Я ненавижу всегда отвечать за свои вопросы, но я решил использовать это:

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 - (количество резервирований до этого, не принадлежащих одному и тому же событию).

Я думаю о каких-либо недостатках, но я не нашел ни одного.

0 голосов
/ 23 декабря 2011

Фильтрация с использованием Reservation.objects.filter(event_id = some_event_id) должна быть достаточной. Это даст вам QuerySet, который должен каждый раз иметь одинаковый порядок. Или я что-то упустил в вашем вопросе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...