Python Django select_不执行任何相关操作

Python Django select_不执行任何相关操作,python,django,Python,Django,我在django中有一个注释模型,其中包含对用户模型的外键引用,我正在尝试查找某个帖子ID的注释,然后加入/获取该注释作者的用户数据。这就是我正在做的 result = Comment.objects.filter(post=post).select_related('user').order_by('-created_at') 当我返回结果时,得到的对象与添加select_相关函数之前得到的对象完全相同。我在这里遗漏了什么吗?该函数在查询中进行连接,因此将使用查询加载相关.user对

我在django中有一个注释模型,其中包含对用户模型的外键引用,我正在尝试查找某个帖子ID的注释,然后加入/获取该注释作者的用户数据。这就是我正在做的

    result = Comment.objects.filter(post=post).select_related('user').order_by('-created_at')
当我返回结果时,得到的对象与添加select_相关函数之前得到的对象完全相同。我在这里遗漏了什么吗?

该函数在查询中进行连接,因此将使用查询加载相关.user对象的数据。如果不使用.select_related..,则访问注释的.user将导致额外的查询。如果因此需要加载N条注释的所有用户,那么需要N+1个查询,这就是著名的N+1问题

.选择与您相关的。。因此,在功能上不会有太大变化,但是如果您计划访问评论的所有.user,则会显著提高性能

例如,您可以使用以下命令打印注释对象中.username的.username:

for comment in Comment.objects.select_related('user'):
    print(comment.user.username)
如果您在没有。的情况下执行此操作,请选择\u相关。。子句,它将导致大量查询。

该函数在查询中进行联接,因此将使用该查询加载相关.user对象的数据。如果不使用.select_related..,则访问注释的.user将导致额外的查询。如果因此需要加载N条注释的所有用户,那么需要N+1个查询,这就是著名的N+1问题

.选择与您相关的。。因此,在功能上不会有太大变化,但是如果您计划访问评论的所有.user,则会显著提高性能

例如,您可以使用以下命令打印注释对象中.username的.username:

for comment in Comment.objects.select_related('user'):
    print(comment.user.username)

如果您在没有。的情况下执行此操作,请选择\u相关。。子句,它将导致大量查询。

您希望有什么不同?@willemvanonsem我不应该像常规联接一样在对象中查看用户数据吗?我只看到了用户ID.no,.select\u related的意思是它将进行连接,从而在同一查询中加载related.user对象中的数据。这样就避免了N+1问题。@willemvanonsem是的,这正是我想要的,但正如我所说,它无法获取用户数据。您可以使用例如mycomment.user.username来访问它,以获得我假定的作者的用户名。您希望有什么不同?@willemvanonsem我不应该像常规联接一样在对象中看到用户数据吗?我只看到了用户ID.no,.select\u related的意思是它将进行连接,从而在同一查询中加载related.user对象中的数据。这样就避免了N+1问题。@willemvanonsem是的,这正是我想要的,但正如我所说,它无法获取用户数据。您可以使用例如mycomment.user.username来访问它,以获取我假设的作者的用户名。好吧,我想我得到了我做错的地方。我对注释模型使用了序列化程序DRF,但对用户数据没有嵌套的序列化程序,所以我添加了它。不确定这是不是正确的方法,但它似乎在起作用,所以我想我知道我做错了什么。我对注释模型使用了序列化程序DRF,但对用户数据没有嵌套的序列化程序,所以我添加了它。不确定这是不是正确的方法,但它似乎起了作用