在Django中实现外键子集

时间:2013-05-24 00:39:01

标签: django django-models django-templates foreign-keys

我正在Django中建立一个论坛风格的网站,并且在我的设计结构中遇到了一些问题。相关代码(来自我的模型)看起来像:

class Thread(models.Model):
    post_count = models.IntegerField()

class Post(models.Model):
    text = models.CharField(max_length=1000)
    thread = models.ForeignKey(Thread)

我遇到的问题是,在我的视图和模板中,我遍历线程并显示帖子。但是,我希望与我的模板沟通,帖子可能具有某些“特殊属性”(例如,帖子创作者,最新帖子,得分最高的帖子等)。我认为这些是线程的属性而不是帖子本身似乎是合理的(因为每个线程都会有这些,但只有一个变量/可忽略不计的帖子数量)但是我已经成功解决了这个问题的解决方案涉及将帖子双重链接到线程(通过Post定义中的另一个ForeignKey(Thread))或将BooleanFields放在Post定义中以指示这些列表中的状态。我甚至不确定它们是否可以在Django模板中显示或显示。

我的问题:在Django中是否有一种干净的方法来专门化或分组已经通过外键中的姐妹元素链接的模型实例,即将ForeignKey子集化为单独(可能重叠)的组?或者我是以nonpythonic / nondjango的方式解决这个问题?任何有关我可能忽略的文档的见解或链接都将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可能需要在Thread

中添加某些属性作为ManyToManyField
class Thread(models.Model):
    post_count = models.IntegerField()
    post_latest = models.ManyToManyField(Post, related_name='as_latest', null=True, blank=True)

或者,我更喜欢使用@property来获取某些属性所需的数据:

class Thread(models.Model):
    post_count = models.IntegerField()

    @property
    def post_latest(self):
        return self.post_set.order_by('-id')[:10]