Django查找所有符合2列条件的行

nwwlzxa7  于 2022-12-01  发布在  Go
关注(0)|答案(2)|浏览(119)

想象一下这样的模型事件
| 姓名|电邮|
| - -|- -|
| A级|u1@example.org|
| 乙|u1@example.org|
| 乙|u1@example.org|
| C语言|u2@example.org|
| 乙|u3@example.org|
| 乙|u3@example.org|
| A级|u4@example.org|
| 乙|u4@example.org|
我希望查找包含名称AB的所有电子邮件。在我的示例["u1@example.org", "u4@example.org"]
今天我在做

emails = [
    e["email"]
    for e in models.Event.objects.filter(name__in=["A", "B"])
    .values("email")
    .annotate(count=Count("id"))
    .order_by()
    .filter(count__gt=1)
]

它不工作,因为我也得到重复的电子邮件只包含一个名称(如u3@example.org)。

3phpmpom

3phpmpom1#

在尝试了不同的方法后,我找到了解决办法

events = ["A", "B"]
emails = [
    e["email"]
    for e in models.Event.objects.filter(name__in=events)
    .values("email")
    .annotate(count_name=Count("name", distinct=True))
    .order_by()
    .filter(count_name=len(events))
]

我需要按email分组,计算不同name的数量,并按等于事件数量的计数进行筛选。

waxmsbnn

waxmsbnn2#

如果您不需要该模型,则可以使用此选项,它会产生预期的结果:

from django.db import connection

def get_random_events(request):
    cursor = connection.cursor()
    cursor.execute("SELECT DISTINCT email FROM event WHERE name = 'A' OR 'B'")
    for row in cursor:
        print(row[0])

    return  render(request, 'blank.html')

至于ORM,问题出在查询的最后一部分,似乎不可能正确地构建WHERE子句。我最好的尝试是使用Q查找,仍然......同样的问题:

RandomEvent.objects.values('email').distinct().filter(Q(name='B') | Q(name='A'))

# Query Structure
SELECT DISTINCT email FROM random_event WHERE (name = 'B' OR name = 'A')

相关问题