Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django中无循环引用的双向查询_Python_Django - Fatal编程技术网

Python Django中无循环引用的双向查询

Python Django中无循环引用的双向查询,python,django,Python,Django,假设您有两种模型:Post和Category。每个Post都有一个category\u id 获取帖子的分类很简单:post.category。如果你想得到某个类别的所有帖子怎么办?我想你会的 def posts(self): return Post.filter(category__pk=self.id) 但是,如果Post模型和Category模型位于不同的文件中,该怎么办?因为Post和Category现在相互需要,所以最终会得到一个循环引用 也许你会说解决方法是将Post和Ca

假设您有两种模型:
Post
Category
。每个
Post
都有一个
category\u id

获取帖子的分类很简单:
post.category
。如果你想得到某个类别的所有帖子怎么办?我想你会的

def posts(self):
    return Post.filter(category__pk=self.id)

但是,如果
Post
模型和
Category
模型位于不同的文件中,该怎么办?因为
Post
Category
现在相互需要,所以最终会得到一个循环引用

也许你会说解决方法是将
Post
Category
放在同一个文件中。但是,如果你的应用程序有50种不同的型号,其中许多型号相当大,都在不同的文件中,那会怎么样?您是否应该将
Post
Category
合并到一个文件中,并将所有其他文件分开?你应该把所有50个模型合并成一个巨大的文件吗

我希望找到两件事中的一件:

  • 这个问题的答案不涉及合并文件
  • 将模型分组到彼此相同的文件中是一个很好的逻辑原因。我所有的模型在某种程度上都是相关的,那么,就分组而言,你的底线在哪里呢?如果你用外键画线,我所有的模型都会在同一个文件中结束

  • 您可以通过模型名称(即字符串)而不是实际对象来引用模型。它们在不同的应用程序中吗?在这种情况下,您可以使用点符号引用它们,如中所述:

    您还可以在函数中导入模型,而不是在文件顶部导入。我经常这样做是为了避免循环引用:

    def posts(self):
        from posts.models import Post
        return Post.filter(category__pk=self.id)
    

    第一部分。关于你的问题:

    Django会自动为您设置反向关系。在您的类别中,您可以访问
    post\u set
    属性,该属性本身就是
    管理器,因此您可以执行以下操作:

    def posts(self):
        return self.post_set.all()
    
    查看更多关于此的信息

    第二部分。我有一个不太完整的答案。。。如果您需要将模型分解成如此多的文件,那么您可能会遇到一个更基本的问题。我想你应该考虑把这个巨大的应用程序分解成一些较小的应用程序

    我认为我得到的关于减少应用程序大小的最好建议是“做一件事”。如果你的应用程序不能用一个相对较短的词组来描述,那么值得考虑如何将其拆分为多个较小的应用程序——每个应用程序将“做一件事”

    当然,这一建议内容相当丰富。要想弄清楚如何分解一些复杂的任务需要相当多的计划,有时事后诸葛亮是唯一能看到事情失控的方法。重构你所说的那么大的东西可能会让人望而生畏。(如果你能看出我是凭经验说话的!)。在这种情况下,我唯一的建议就是一步一步地走。试着把看起来像是大的、跨越应用程序的问题分解成小的、可管理的部分,并在可能的时候进行处理


    为了满足您的迫切需要,我建议将您的模型按局部或分类方式分组到文件中。它可能会引导您将这一个(听起来像是一个巨大的)应用程序重构为许多较小的应用程序。我认为这才是你真正应该朝着的方向。

    “你最终会得到一个循环引用”。这种假设是完全错误的。你为什么这么说?我试过了,就是这样。请把你试过的代码贴出来。您的代码中有一个错误。你在问题末尾的所有“也许你说……”都是基于错误的假设。请发布代码和您实际遇到的错误。让我看看我们是否在同一页上。你是说你可以把两个模型放在两个单独的文件中,每个文件都包含了对方,这是个假设问题。我不想调试特定的错误。我试图更清楚地理解某些Django概念的工作方式及其背后的哲学。
    def posts(self):
        return self.post_set.all()