【问题标题】:Django forum model with not unique posts id具有不唯一帖子 ID 的 Django 论坛模型
【发布时间】:2012-01-06 20:02:05
【问题描述】:

我学习 python 和 django 并尝试制作一些简单的论坛。我创建了模型:

class Board(models.Model):
    title = models.CharField(max_length=200)
    description = models.TextField(blank = True)

class Post(models.Model):
    board = models.ForeignKey(Board)
    ...

我希望每个板的帖子编号从 0 开始。我应该如何改变我的模型来实现这一目标?我做错了什么?

【问题讨论】:

    标签: django forum


    【解决方案1】:

    我不知道您是否在谈论使用主键作为帖子 ID,但如果您希望它在每个板上以 0 开头,那将不起作用。我建议在您的 Post 模型上添加另一个字段,并在 save 方法上自己管理它。示例:

    class Post(models.Model):
        board = models.ForeignKey(Board)
        post_count = models.PositiveIntegerField(default=0)
    
        def save(self, *args, **kwargs):
            if not self.id:
                self.post_count = self.board.post_set.count()
            super(Post, self).save(*args, **kwargs)
    

    编辑: 正如 Brian 指出的那样,删除帖子时可能会出现问题。这将导致重复的post_ids。您可以在模型中添加 deleted 字段以“假”删除帖子(当 deleted = True 时不显示),这将保持 post_id 计数准确。

    编辑 2:您可以将 post_count 设置为该版块的最大帖子数 + 1(如果计数为 0,则为 0)

    【讨论】:

    • +1 编辑 2。try: id = self.board.post_set.latest('post_count') except self.DoesNotExist: id 0
    • 谢谢你的回答,真的很有帮助。如果我理解正确,如果我只使用“post_count”并且不触摸 id 本身,那么删除不应该有问题吗?
    • 您应该将id 用于内部使用,因为它在所有版块中都是唯一的,但听起来您想使用post_count 来显示用户,或者在URL 中使用。
    • 这引入了竞争条件。 (第二个帖子在第一个帖子调用super(.., save)之前获取post_set.count())。认为您可以通过在(board, post_count) 上添加unique_together 并在super(.., save) 上捕获异常(注意不要捕获其他错误)并重试来修复。
    【解决方案2】:

    如果这确实是您想要的,您必须自己管理它,方法是在您的 Post 模型中添加某种 IntegerField

    我会认真质疑您为什么要这样做。这将很难维护,特别是如果您开始添加删除帖子或将帖子从一个Board 移动到另一个的功能。

    【讨论】:

    • 我想我在 kusaba imageboard 上看到了该功能,其中帖子的 id 仅与板相关,只是想知道,如何在 django 上制作这样的东西。感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多