我们说我的模型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中完成吗?
答案 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()
,但会对潜在的递归问题更加强大。)