我在模型'a'和模型'b'
中都有100k记录ex:
class A(models.Model):
user_email = models.EmailField(null=True, blank=True)
user_mobile = models.CharField(max_length=30, null=True, blank=True)
book_id = models.CharField(max_length=255, null=True, blank=True)
payment_gateway_response = JSONField(blank=True, null=True)
class B(models.Model):
order = models.ForeignKey(A, null=True, blank=True)
pay_id = models.CharField(max_length=250, null=True, blank=True)
user_email = models.EmailField(null=True, blank=True)
user_mobile = models.CharField(max_length=30, null=True, blank=True)
created = models.DateTimeField(blank=True, null=True)
total_payment = models.DecimalField(decimal_places=3, max_digits=20, blank=True, null=True)
我想使用A值
获取B的对象例如
all_a = A.objects.all()
for a in all_a:
b = B.objects.filter(user_email=a.user_email, user_mobile=a.user_mobile)
这很好,我得到了结果。但是由于它是100k记录,所以花了太多时间。循环迭代需要时间。在django中有什么更快的方法?
您可以在a和filter b中获得具有这些值的每个值的列表。
a = A.objects.all()
emails = list(a.values_list('user_email', flat=True))
mobiles = list(a.values_list('user_mobile', flat=True))
b = B.objects.filter(user_email__in=emails, user_mobile__in=mobiles)
结果可能会有一对未在A中配对的电子邮件和移动模型,那么您将不会有任何问题。
如果您对模型不感兴趣,则使用iterator()
可以提高性能(请参阅参考https://docs.djangoproject.com/en/en/1.11/ref/型号/querysets/#iTerator(:
for a in A.objects.all().iterator():
b = B.objects.filter(user_email=a.user_email, user_mobile=a.user_mobile)
你可以做
import operator
from django.db.models import Q
q = A.objects.all().values('user_email', 'user_mobile')
B.objects.filter(reduce(operator.or_, [Q(**i) for i in q]))
如果您想对每个b
对象进行某些操作取决于a
。这不是方式。