一对多的Django查询
Django query in one to many
我有 2 个表,User
和 Payment
具有一对多关系。
付款时我有字段 date_updated
和 status
。
我能否在一个查询中获取所有使用 date_updated < 3 months ago
付款的用户,如果有超过 3 个月前的其他付款,状态应该不同于已完成。如果在用户身上发现此类付款,则应退还该用户。
例如,我有一个用户去年只支付了一笔款项,我想退回,但如果同一用户最近有另一笔付款,而不是 3 个月前,并且状态为已完成,则用户不应该被退回。
我在尝试什么:
User.objects.filter(
Q(orders__payments__date_updated__lte=time_x_months) &
Q(Q(orders__payments__date_updated__gte=time_x_months) &
~Q(orders__payments__status=Payment.STATUS_COMPLETED))
)
它可能会像这样从 Payment
存档查询:
from django.db.models import Count, Q
users = Payment.objects.filter(
Q(date_updated__lte=time_until) &
Q(date_updated__gte=time_from) &
~Q(status=Payment.STATUS_COMPLETED)
).values('user').annotate(count=Count('pk'))
或者只是:
from django.db.models import Count
users = Payment.objects.filter(
date_updated__lte=time_until,
date_updated__gte=time_from
).exclude(
status=Payment.STATUS_COMPLETED)
).values('user').annotate(count=Count('pk'))
(缩进可能有误)
我有 2 个表,User
和 Payment
具有一对多关系。
付款时我有字段 date_updated
和 status
。
我能否在一个查询中获取所有使用 date_updated < 3 months ago
付款的用户,如果有超过 3 个月前的其他付款,状态应该不同于已完成。如果在用户身上发现此类付款,则应退还该用户。
例如,我有一个用户去年只支付了一笔款项,我想退回,但如果同一用户最近有另一笔付款,而不是 3 个月前,并且状态为已完成,则用户不应该被退回。
我在尝试什么:
User.objects.filter(
Q(orders__payments__date_updated__lte=time_x_months) &
Q(Q(orders__payments__date_updated__gte=time_x_months) &
~Q(orders__payments__status=Payment.STATUS_COMPLETED))
)
它可能会像这样从 Payment
存档查询:
from django.db.models import Count, Q
users = Payment.objects.filter(
Q(date_updated__lte=time_until) &
Q(date_updated__gte=time_from) &
~Q(status=Payment.STATUS_COMPLETED)
).values('user').annotate(count=Count('pk'))
或者只是:
from django.db.models import Count
users = Payment.objects.filter(
date_updated__lte=time_until,
date_updated__gte=time_from
).exclude(
status=Payment.STATUS_COMPLETED)
).values('user').annotate(count=Count('pk'))
(缩进可能有误)