在Django模型中添加临时信息的最佳方式是什么?(不创建新模型)

0 投票
1 回答
1686 浏览
提问于 2025-04-18 17:02

理解我的问题最好的方式是通过代码:

class ToDoList(TimeStampedModel):
    DEFAULT_THEME = 1

    name = models.CharField(max_length=32)
    ... # other fields
    STATUS_CHOICES = (
        ('C', 'CREATED'),
        ('R', 'READY'),
        ('V', 'VALIDATED')
    )
    status = models.CharField(max_length=1, choices=STATUS_CHOICES, default='C')

这里有几种用户类型:

  • 创建者:可以创建待办事项列表并请求验证
  • 验证者:可以验证这个列表

现在,当一个验证者拒绝验证请求时,他必须提供一个理由。这个情况大概只会发生在10%的情况下,所以我不想在我的待办事项模型里加一个拒绝理由的字段。

我知道一个明显的解决方案是创建另一个模型,叫做理由(Reason),里面只有一个字符字段,并且有一个外键指向我的待办事项模型,但我想知道有没有更好的方法。

我不知道这是否有帮助,但我正在使用django-rest-framework来做API。

谢谢。

更新

在验证者拒绝列表后,他必须提供理由,这样创建者才能修改列表中有问题的地方。修改完后,创建者会再次请求验证。这个过程会一直持续,直到验证者接受这个待办事项列表。到那时,拒绝理由就不再需要了,所以可以删除。

所以,最终拒绝理由将不再存在,我觉得在数据库空间的角度来看,保留一个只会临时使用的字段是不太合适的。

1 个回答

1

你其实不需要太担心怎么存储一小段文本和你的 ToDoList 一起。下面是我如果想简单处理这个问题的方法,不想再增加一个模型。

class ToDoList(models.Model):
    name = models.CharField(...)
    validated_at = models.DateTimeField(..., null=True, editable=False)
    rejection_reason = models.TextFiel(..., editable=False)

你可以查询 validated_at__isnull=False 来获取已经验证过的待办事项列表,这样就可以忽略 rejection_reason 了。如果你想获取未验证的待办事项列表,可以查询 validated_at__isnull=True,然后用 rejection_reason 来告诉用户原因。如果你想节省数据库的空间,可以在待办事项被验证后清空 rejection_reason 这个字段。你还可以使用 filter (rejection_reason="") 来筛选出没有拒绝原因的待办事项(比如那些还没有被验证或拒绝的),或者用 exclude 来获取那些已经被拒绝的事项。

撰写回答