Django: Уникальные идентификаторы для каждой подмодели модели

Я довольно новичок в Django, но я думаю, что мой вопрос больше относится к проектированию баз данных независимо от фреймворка или платформы.

Позвольте мне объяснить, используя следующую быструю псевдомодель. У меня есть следующие две модели:

class Issue(models.Model):
    title = models.CharField(max_length=60)
    status = models.IntegerField(choices=Status.choices, default=Status.OPEN)
    ...

class Comment(models.Model):
    issue = models.ForeignKey(Issue, on_delete=models.CASCADE, related_name="comments")
    text = models.TextField()
    ...

В моем веб-приложении я создаю коллекцию Issues. Каждому выпуску присваивается автоматически генерируемый django уникальный идентификационный номер (pk), что идеально. И для каждого выпуска есть свойство comments, которое содержит коллекцию комментариев, специфичных для этого выпуска.

Каждый комментарий также имеет сгенерированный системой уникальный ID, но последовательность этого ID не является специфичной для модели Issue. То есть, если я создаю 3 комментария в Выпуске №1 (комментарий №1, №2, №3), а затем создаю комментарий в Выпуске №2, то ID этого комментария будет установлен как №4, а не №1.

Я понимаю, что так определены модели данных. Я бы хотел, чтобы при создании нового вопроса и добавлении комментария его ID начинался с 1. Я не могу определить ID комментария вручную, увеличивая его по сравнению с ID предыдущего комментария, потому что веб-приложение позволит пользователям удалять комментарии. Таким образом, если есть 3 комментария под проблемой и последний комментарий №3 удален, то при следующем добавлении комментария ему должен быть присвоен уникальный ID №4.

Есть предложения, как мне реализовать надежное решение для этого? TIA

Вы можете использовать forloop.counter

Попробуйте

{% for comment in issue.comments.all %}
    No: {{ forloop.counter }}
    {{ comment.text }}
{% endfor %}

Мне кажется, что вы пытаетесь отслеживать количество комментариев в каждом выпуске. Это можно сделать с помощью Issue.comments.count() или использовать кэшируемое свойство, которое обновляется каждый раз, когда появляется новый комментарий. Если вы хотите знать порядок добавления комментариев, вы можете добавить поле created_at и использовать его для упорядочивания в запросах следующим образом issue.comments.order_by('created_at').

добавьте поле datetimeField created_at в таблицу комментариев и сортируйте по created_at для возврата запроса

Что бы я сделал, это, вероятно, что-то немного другое. Я бы добавил что-то вроде иерархии в модель Comment. (и не игрался бы с автоматически генерируемыми идентификаторами Django).

class Comment(models.Model):
    issue = models.ForeignKey(Issue, on_delete=models.CASCADE, related_name="comments")
    text = models.TextField()
    hierarchy = models.IntegerField() 
...

Таким образом, комментарии по id будут выглядеть следующим образом:

  1. Выпуск1 - C1, C2, C3 ... C1-h1, C2-h2, C3-h3 (где h - иерархия)
  2. Выпуск2 - C4, C5, C6 ... C4-h1, C5-h2, C6-h3.

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

Дайте мне знать, если я должен уточнить больше.

Вернуться на верх