python - 在模型 B 的字段 django 中比较模型 A 的字段值

标签 python django django-queryset

我在模型“A”和模型“B”中都有 10 万条记录

例如:

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 条记录,因此需要花费太多时间。 for 循环迭代需要时间。在 Django 中有更快的方法吗?

最佳答案

您可以获得 a 中每个值的列表,并使用这些值过滤 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 中不成对。但是如果您确保电子邮件和手机在 A 中是唯一的并且每个 B 中的电子邮件和手机都基于 A'模型,那么你就不会有任何问题。

关于python - 在模型 B 的字段 django 中比较模型 A 的字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43515798/

相关文章:

python - 使用 lxml 从某个 xml 标签中提取所有文本

python - 在积极的后视中使用积极的前瞻?

python - PyCharm docker 调试错误

python - 检查 QuerySet 中是否存在对象

python - 如何检查两个 XML 文档的等价性?

python - Django 1.8 : Model doesn't appear in admin panel

python - Django 未将图像文件上传到 Azure 存储容器

python - Django 查询集结果测试错误

python - 用于从字符串开头开始的 substr 匹配的 Django Queryset

sql - 在 Django 中对 ValuesQuerySet 使用 extra()