将 Django ORM 迭代放入一个请求

Put Django ORM iterations to one request

我有三个模型:

class Box(models.Model):
    name = models.TextField(blank=True, null=True)


class Toy(models.Model):
    box = models.ForeignKey(Box, related_name='toys')


class ToyAttributes(models.Model):
    toy = models.ForeignKey(Toy)
    color = models.ForeignKey(Color, related_name='colors')

并列出:

pairs = [[10, 3], [4, 5], [1, 2]]

其中每个值都是一对或框和颜色 ID。 我需要过滤此数据并 return 将对象与所需颜色的玩具装箱。

现在我这样做:

for n in list:
    box = Box.objects.filter(id=n[0], toys__colors=n[1])
    if box.exist():
        ...

但是长列表需要很多时间,据我所知,因为有多个 SQL 请求。我可以让它更快吗?是否可以通过一个请求只获得需要的盒子,我该怎么做?谢谢!

你应该看看 django Q function 并在循环中构造你的查询,像这样向 Q 添加值

query = Q()
for box_id, toy_color in [[10, 3], [4, 5], [1, 2]]:
   query |= Q(Q(id=box_id) & Q(toys__colors=toy_color))
Box.objects.filter(query)

这应该适合你。

from django.db.models import Q

pairs = [[10, 3], [4, 5], [1, 2]]

conditions = [Q(id=box) & Q(toys__colors=color) for box, color in pairs]

query = Q()
for c in conditions:
    query |= c

Box.objects.filter(query)