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. 问题 1 - C1、C2、C3 ... C1-h1、C2-h2、C3-h3(其中 h 是层次结构)
  2. 问题 2 - C4、C5、C6 ... C4-h1、C5-h2、C6-h3。

这样你就可以在前端显示层次结构(不是id),当你删除评论时(你提到过),你将能够继续使用h4。 (据我了解,这是您的预期目的)。

如果我需要进一步说明,请告诉我。