将 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)
我有三个模型:
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)