2012-01-06 27 views
0

我学习python和django,并试图做一些简单的论坛。我创建了模型: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开始计算编号。我应该如何改变我的模型以实现这一目标?我究竟做错了什么?

回答

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) 

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

编辑2:您可以设置post_count等于最大员额数为这款主板+ 1(或0,如果计数为0)

+1

+1 on edit 2.'try:id = self.board.post_set.latest('post_count')except self.DoesNotExist:id 0' – 2012-01-06 21:29:52

+0

谢谢你的回答,真的有帮助。如果我理解你是对的,如果我只用'post_count'工作,不要触摸身份证本身,那么不应该有删除? – user1135058 2012-01-06 21:41:07

+0

你应该使用'id'作为内部使用,因为它在所有主板上都是唯一的,但听起来像你想使用'post_count'来显示用户或者在URL中。 – 2012-01-06 22:35:30

0

如果这确实是你想要的,你必须自己管理它,在Post模型中增加一些IntegerField

我真的很怀疑你为什么要这么做。这将很难保持,特别是如果您开始添加删除帖子或将帖子从一个Board转移到另一个的能力。

+0

我想我看见草场imageboard,其中该功能帖子有唯一的ID登上它相关,只是想知道,如何做一个这样的事在Django上。谢谢你的回答。 – user1135058 2012-01-06 21:35:20