比较查询集和查询集的最佳方法

时间:2020-09-08 18:33:02

标签: python django orm django-queryset

我有一个要与查询集进行比较的查询集。

说我有这样的查询集:

x = Thing.objects.get(user=request.user).thing_response.all()

然后我有一个查询集,它可以像这样获取每个“事物”和相关响应

all = Things.objects.all()
i = [x.id for x in all.thing_response.all()]

我用x和i建立了一个ID列表。现在,我想在x中获得i的完全匹配项:它适用于小数据,但是当数据增长时,匹配停止。

我将set用于匹配:if set(x) == set(i)循环

,但是当数据变大时它不起作用。有没有更好的方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

我不知道我是否很好地理解了您的问题,但是比较这两个列表的一种方法是使用类似的方法:

x = []
try:
    x = Thing.objects.get(
        user=request.user
        ).thing_response.values_list('id', flat=True)
except Thing.DoesNotExist:
    pass
except Thing.MultipleObjectsReturned:
    pass

,然后使用以下命令检索所有thing_response个ID的列表:

i = Thing.objects.filter(
    thing_response__isnull=False
    ).values_list('thing_response__id', flat=True)

注1:如果确定每个查询中只有一项(即Thing.objects.get),则可以摆脱异常处理部分。

注2:thing_response__isnull=False将排除与thing_response没有任何关系的项目。

最后比较这两个列表:

if set(x) == set(i):
    print('Given lists are equal')