在 Django 中实现外键子集

Posted

技术标签:

【中文标题】在 Django 中实现外键子集【英文标题】:Implementing Subsets of Foreign Keys in Django 【发布时间】:2013-05-19 12:46:19 【问题描述】:

我正在用 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))或通过在 Post 定义中放置 BooleanFields 以指示这些列表中的状态。我什至不确定这些在 Django 模板中是否有效或可见。

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

【问题讨论】:

【参考方案1】:

您可能需要在 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]

【讨论】:

以上是关于在 Django 中实现外键子集的主要内容,如果未能解决你的问题,请参考以下文章

在子表 Laravel 中插入数据时出现外键问题

保存产品时出现外键约束错误

执行全新安装 Piranha CMS 时出现外键约束错误

在 Django 的 inlineformset_factory 中选择外键元素的子集

在Django中实现具有许多重叠字段的模型的最佳方法?

通过django模板中的外键关系快速访问模型属性