【问题标题】:Django .defer() for removing value from querysetDjango .defer() 用于从查询集中删除值
【发布时间】:2021-11-07 23:03:45
【问题描述】:
def get_client_queryset(query=None):
    queryset = []
    queries = query.split(' ')
    for q in queries:
        details = clients.objects.filter(
            Q(name__icontains=q) |
            Q(number__icontains=q) |
            Q(email__icontains=q)
        ).distinct().defer(unique_num)
        for client in details:
            queryset.append(client)
    return list(set(queryset))

.defer('unique_num') 仍在返回并显示在查询集中。提供的功能是搜索功能

【问题讨论】:

  • 这是有道理的,因为.defer(...) 意味着您将稍后在必要时延迟加载该字段。
  • 换句话说,.defer() 表示“我将(可能)不需要该字段”,但如果我需要它,请进行查询以获取它。
  • 您到底想做什么。 Likey 有比对每个 queries 项进行查询更好的解决方案。
  • 我想返回除 'unique_num' 和 'primary_key' 之外的所有其他字段
  • 那么你可以使用.values()并列出所有要返回的项目,但我不明白为什么不应该返回unique_numprimary_key。您可以创建一个省略这些字段的序列化程序。通常最好返回模型对象,并让此类序列化程序处理如何将其转换为 JSON/...

标签: python django search django-views


【解决方案1】:

.defer('unique_num') 仍在返回并显示在查询集中。

这是有道理的,因为.defer(…) [Django-doc] 意味着您将延迟加载该列。因此.defer(…) 常用于防止加载包含大量数据的列。

可以使用.values(…) [Django-doc] 来返回只包含上面列出的值的字典。

from re import escape as rescape

def get_client_queryset(query=None):
    regex = '|'.join(rescape(q) for q in query.split(' '))
    return clients.objects.filter(
        Q(name__iregex=regex) |
        Q(number__iregex=regex) |
        Q(email__iregex=regex)
    ).values('name', 'number', 'email')

然而,最好返回模型对象,然后将其序列化为带有Serializer [drf-doc] 的 JSON blob(或其他输出格式):Django 的 REST 框架用于创建 REST API。可以为搜索结果定义这样的 API,并决定将哪些数据传递给客户端。在这种情况下,查询集返回 'unique_num',但未序列化:

from re import escape as rescape
from rest_framework import serializers

class ClientSerializer(serializer.ModelSerializer):
    class Meta:
        model = Client
        exclude = ['unique_num']

def get_client_queryset(query=None):
    regex = '|'.join(rescape(q) for q in query.split(' '))
    return clients.objects.filter(
        Q(name__iregex=regex) |
        Q(number__iregex=regex) |
        Q(email__iregex=regex)
    )

那么视图看起来像这样:

serializer = ClientSerializer(get_client_queryset(), many=True)
data = serializer.data

【讨论】:

    猜你喜欢
    • 2021-05-29
    • 2018-10-26
    • 2017-08-12
    • 2011-06-09
    • 2021-09-09
    • 1970-01-01
    • 2013-04-08
    • 2011-06-01
    • 2019-07-01
    相关资源
    最近更新 更多