Django:模型的每个子模型的唯一 ID
Django: Unique IDs for each sub-model of a Model
我对 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
的集合。每个issue都分配了一个django自动生成的唯一ID号(pk),堪称完美。对于每个问题,都有一个 属性 comments
,其中包含针对该问题的一组评论。
每条评论也有一个系统生成的唯一ID,但这个ID的顺序并不特定于Issue模型。意思是如果我在问题 #1 中创建了 3 个评论(评论 #1、#2、#3),然后我在问题 #2 下创建了一个评论,该评论的 ID 将设置为 #4 而不是 #1。
我知道这是定义数据模型的方式。我想要的是,每当创建一个新问题并添加一条评论时,它的 ID 应该从 1
开始。我无法通过递增之前的评论 ID 来手动定义评论 ID,因为网络应用程序也将允许用户删除评论。因此,如果一个问题下有 3 条评论,最后一条评论 #3 被删除,下次添加评论时,它应该被赋予一个唯一的 ID #4。
有什么建议可以帮助我实施可靠的解决方案吗? TIA
编辑:每次从 1 重新启动评论 ID 的目的是评论 ID 将显示在每个评论的 HTML 中。供广大用户参考使用。
你可以利用forloop.counter
试试这个
{% for comment in issue.comments.all %}
No: {{ forloop.counter }}
{{ comment.text }}
{% endfor %}
更新:
要修复删除评论时的重新编号,最好的办法是执行 soft-deletion
{% for comment in issue.comments.all %}
{% if comment.is_active %}
No: {{ forloop.counter }}
{{ comment.text }}
{% endfor %}
{% endfor %}
向评论模型添加一个 is_active
布尔值
class Comment(models.Model):
...
is_active = models.BooleanField(default=True)
然后不删除 Comment 对象,而是将 is_active
设置为 False
,这将防止模板中的重新编号问题
在我看来,您似乎在尝试跟踪每个问题的评论数。这可以使用 Issue.comments.count()
或使用每次有新评论时更新的缓存 属性 来完成。如果您想知道添加评论的顺序,您可以添加一个 created_at
字段并将其用于查询中的排序,如下所示 issue.comments.order_by('created_at')
.
在注释 table 中添加 created_at datetimeField 并按 created_at 排序到 return query
我会做的可能有点不同。我会在 Comment 模型中添加某种层次结构。 (不要玩弄 Django 自动生成的 ID)。
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。 (据我了解,这是您的预期目的)。
如果我需要进一步说明,请告诉我。
我对 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
的集合。每个issue都分配了一个django自动生成的唯一ID号(pk),堪称完美。对于每个问题,都有一个 属性 comments
,其中包含针对该问题的一组评论。
每条评论也有一个系统生成的唯一ID,但这个ID的顺序并不特定于Issue模型。意思是如果我在问题 #1 中创建了 3 个评论(评论 #1、#2、#3),然后我在问题 #2 下创建了一个评论,该评论的 ID 将设置为 #4 而不是 #1。
我知道这是定义数据模型的方式。我想要的是,每当创建一个新问题并添加一条评论时,它的 ID 应该从 1
开始。我无法通过递增之前的评论 ID 来手动定义评论 ID,因为网络应用程序也将允许用户删除评论。因此,如果一个问题下有 3 条评论,最后一条评论 #3 被删除,下次添加评论时,它应该被赋予一个唯一的 ID #4。
有什么建议可以帮助我实施可靠的解决方案吗? TIA
编辑:每次从 1 重新启动评论 ID 的目的是评论 ID 将显示在每个评论的 HTML 中。供广大用户参考使用。
你可以利用forloop.counter
试试这个
{% for comment in issue.comments.all %}
No: {{ forloop.counter }}
{{ comment.text }}
{% endfor %}
更新:
要修复删除评论时的重新编号,最好的办法是执行 soft-deletion
{% for comment in issue.comments.all %}
{% if comment.is_active %}
No: {{ forloop.counter }}
{{ comment.text }}
{% endfor %}
{% endfor %}
向评论模型添加一个 is_active
布尔值
class Comment(models.Model):
...
is_active = models.BooleanField(default=True)
然后不删除 Comment 对象,而是将 is_active
设置为 False
,这将防止模板中的重新编号问题
在我看来,您似乎在尝试跟踪每个问题的评论数。这可以使用 Issue.comments.count()
或使用每次有新评论时更新的缓存 属性 来完成。如果您想知道添加评论的顺序,您可以添加一个 created_at
字段并将其用于查询中的排序,如下所示 issue.comments.order_by('created_at')
.
在注释 table 中添加 created_at datetimeField 并按 created_at 排序到 return query
我会做的可能有点不同。我会在 Comment 模型中添加某种层次结构。 (不要玩弄 Django 自动生成的 ID)。
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。 (据我了解,这是您的预期目的)。
如果我需要进一步说明,请告诉我。