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 - C1, C2, C3 ... C1-h1, C2-h2, C3-h3 (где h - иерархия)
- Выпуск2 - C4, C5, C6 ... C4-h1, C5-h2, C6-h3.
Таким образом, вы сможете показывать на фронтенде иерархию (не id), и когда вы удалите комментарий (вы упомянули об этом), вы сможете продолжить с h4. (насколько я понимаю, это и было вашей целью).
Дайте мне знать, если я должен уточнить больше.