基于外键的django自动增量

时间:2014-04-05 00:32:06

标签: python django django-models

我们说我的模型Issue看起来像这样:

class Issue(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    text = models.TextField()

另一个名为Comment的人如此:

class Comment(models.Model):
    issue = models.ForeignKey(Issue)
    text = models.TextField()
    number = models.AutoField()

我希望评论编号字段与问题相关。

这意味着每个问题都会有单独的评论#1,评论#2,评论#3等等。

可以在Django中完成吗?

2 个答案:

答案 0 :(得分:8)

如果您从评论模型中删除了数字字段并将其替换为date_added字段,您仍然可以查询数据库以按顺序提取与特定条目关联的所有评论。

class Comment(models.Model):
    issue = models.ForeignKey(Issue)
    text = models.TextField()
    date_added = models.DateField(auto_add_now = True)

然后,如果您想获得与某个问题相关的所有评论:

i = Issue.object.get(pk=1)    #pk = primary key id for whatever issue you want

comments_by_issue = i.comment_set.all().order_by('date_added')

现在您有一些注释可以通过索引位置引用(例如,comments_by_issue [0]可以获得附加到该问题的第一条注释)。

索引位置是我能想到的最接近你想要的东西。有人提到了comment.id,但这只是一个自动递增的整数,每个评论都会有所增加。添加到您的系统的第五个注释可能有comment.id = 5,但它可能是第2个附加的第一个注释 - 如果我正在读取您的查询,那么注释ID在该上下文中没有帮助。

这更像是一种解决方法,而不是直接的答案,但我希望它有所帮助。

答案 1 :(得分:1)

我更喜欢soundeux's solution。那就是说,这就是想法......

class Comment(models.Model):
    # ...
    number = models.PositiveIntegerField(default=1)

    def save(self, *args, **kwargs):
        obj = super(Comment, self).save(*args, **kwargs)
        try:
            last_comment = self.issue.comment_set.all().orderby('-number')[0]
        except KeyError:  # I think it's KeyError... for when there is no comments
            pass
        else:
            Comment.objects.filter(id=self.id).update(number=last_comment.number+1)
        return obj

注意 - 使用ORM的Comment方法更新update时不会执行此操作。实际上,这就是我用来避免递归(这也不是一个非常好的解决方案)。您可能希望将其实现为pre_save事件而不是save()(仍然不会响应update(),但会对潜在的递归问题更加强大。)