【问题标题】:use of select_related in this case of django rest?在 django rest 的这种情况下使用 select_related?
【发布时间】:2022-01-19 06:21:48
【问题描述】:

我有一种情况,我不确定是否会使用 select_related。我有一个这样的模型:

class Example(models.Model): 

    title = models.CharField(max_length=255, blank=True)  
    message = models.TextField(blank=True)
    user = models.ForeignKey(
    User,
    on_delete=models.CASCADE,
    null=True,
    related_name="user_example",
)
    /................./

现在在我看来,我使用了这样的过滤逻辑:

def get_queryset(self):
    
    search = self.request.query_params.get("search", None)

    if search_query is not None:
        queryset = Reactions.objects.filter(
            Q(user__name__icontains=search)
            | Q(user__email__icontains=search)                
        ).distinct()

这里的示例模型与 User 具有 fk 关系,因此它是正向关系而不是反向关系。我是否应该在上面的示例中添加.select_related('user').filter(...) 以减少查询次数,或者这里不需要...我想不通。

序列化器:

class ExampleSerializer(serializers.ModelSerializer):

    user = UserSerializer()

    class Meta:
        model = Reactions
        fields = ["id", "user", "title", "message"]

【问题讨论】:

  • 你能分享你正在使用的序列化器吗?如果您在序列化程序中访问相关用户,那么是的,您应该使用 select_related,如果没有,则没有必要
  • 你好@IainShelvington 我已经用序列化程序更新了它。请检查。

标签: django api django-rest-framework foreign-keys django-select-related


【解决方案1】:

是的,你应该这样做。来自docs

select_related 通过创建 SQL 连接并在 SELECT 语句中包含相关对象的字段来工作。为此,select_related 在同一个数据库查询中获取相关对象。但是,为了避免通过“多”关系连接而产生更大的结果集,select_related 仅限于单值关系 - 外键和一对一。

另一方面,prefetch_related 对每个关系进行单独的查找,并在 Python 中进行“加入”...

在您的情况下,我们处理ForeignKey,因此select_related 是合适的。如果您想确保这会减少数据库查询的数量,您可以为此安装django-debug-toolbar

【讨论】:

  • 我有 django-toolbar,但我使用邮递员进行 api 调用,因为该 api 调用需要身份验证。现在在这种情况下我该如何使用调试工具栏??
  • @Reactoo django-debug-toolbar-request-history 必须帮助你。如果您不确定它是否会妨碍您,您可以暂时禁用身份验证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 2013-07-28
  • 2018-09-22
  • 2013-03-23
  • 1970-01-01
相关资源
最近更新 更多