Tengo 100k registros tanto en el modelo 'A' como en el modelo 'B'
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)Quiero obtener los objetos de B usando los valores de A
por ejemplo
all_a = A.objects.all() for a in all_a: b = B.objects.filter(user_email=a.user_email, user_mobile=a.user_mobile)Esto está bien, estoy obteniendo los resultados. Pero como son 100k registros, está tomando demasiado tiempo. la iteración del ciclo for está tomando tiempo. ¿Hay alguna forma más rápida de hacer esto en django?
Puede obtener una lista de cada valor en a y filtrar b con esos valores.
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)Sin embargo, los resultados pueden tener un par de correo electrónico y móvil que no están emparejados en A. Pero si se asegura de que los correos electrónicos y los móviles serán únicos en A y el correo electrónico y el móvil en cada B se basan en uno de los modelos A', entonces no tendras ningun problema.
Si no está interesado en almacenar en caché el modelo A, puede tener un aumento de rendimiento usando iterator() (consulte la referencia https://docs.djangoproject.com/en/1.11/ref/models/querysets/#iterator ):
for a in A.objects.all().iterator(): b = B.objects.filter(user_email=a.user_email, user_mobile=a.user_mobile)Tu puedes hacer
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])) Si desea hacer algunas operaciones con cada objeto b depende de a . Este no es el camino.