【问题标题】:Django fetch all relationsDjango 获取所有关系
【发布时间】:2012-06-06 06:38:07
【问题描述】:

我有一个和这个 sn-p 结构相似的应用程序

class Blog(models.Model):
    name = models.CharField(max_length=25)

class Category(models.Model):
    name = models.CharField(max_length=25)
    blog = models.ForeignKey(Blog)

class Entry(models.Model):
    title = models.CharField(max_length=25)
    category = models.ForeignKey(Category)

什么是最通用的方式,我可以在其他应用程序中使用它来获取所有博客及其类别和条目?

我考虑为博客模型创建一个管理器,它可以获取该博客的所有类别,但它对模型名称进行了硬编码

 class BlogManager(models.Manager):
     def categories(self):
         return Category.objects.filter(blog=self)

有什么建议吗?

【问题讨论】:

    标签: django foreign-keys


    【解决方案1】:

    你想要的是Select Related。它返回一个 QuerySet,它将自动“遵循”外键关系,在执行查询时选择附加的相关对象数据。您对博客的查询类似于:

    Blog.objects.select_related().filter( something )
    

    Blog.objects.select_related().get( something )
    

    【讨论】:

    • 这种方法的问题是,当我需要访问 10 个包含 20 个类别和每个类别 40 个条目的博客时,我将创建大量的数据库查询,而这些查询我已经拥有了。
    【解决方案2】:

    为什么不使用标准方式? 使用博客的 PK 与 FK 关系进行过滤。

    Category.objects.filter(blog__pk=self.pk)
    

    【讨论】:

    • 因为如果我需要所有博客的所有类别的所有条目,我将不得不对其进行两次迭代。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2014-03-28
    • 2021-02-09
    • 2023-01-22
    • 2021-12-20
    相关资源
    最近更新 更多