[英]Django filtering on related models attributes
class Count(models.Model):
start_time = models.DateTimeField(null = True, blank = True)
end_time = models.DateTimeField(null = True, blank = True)
class AccessRecord(models.Model):
user = models.ForeignKey(get_user_model(), related_name = 'accesses', on_delete = models.CASCADE)
count = models.ForeignKey(Count, related_name = 'accesses', on_delete = models.CASCADE)
使用此模型方案,我如何根据用户对 Count 查询集进行过滤?
例如,我希望每个计数对象都具有具有特定用户 ID 的第一个访问记录。
user_id = 2
all_counts = Count.objects.all()
list(filter(lambda x: x.accesses.first().user.pk == user_id, all_counts))
^^ 这行得通。 但是我得到了一个列表而不是一个查询集(我仍然需要 order_by 等。)
这里最好的选择是什么?
编辑。 每个 Count 保证至少有一个 Access Record。
您还accesses
在过滤器中使用accesses
。
因此Count.objects.filter(accesses__user_id=2)
但这将检索用于此用途的所有计数,而不仅仅是每个第一个 AccessRecord 的计数。
因此,通过添加订单,您可以执行以下操作
first_acccess_count = Count.objects.filter(accesses__user_id=2).order_by('start_time').first()
注意: first_acccess_count
可以是 None,如果用户还没有访问权限。
编辑:问题不清楚,查询应该做:我想要那个 user_id 的每个计数对象。 但是用户需要有第一个访问记录。
from django.db.models import Max
# First retrieve all first created AccessRecord's, by grouping on
# Count and to find all lowest ids of AccessRecords. As lower id
# can be seen as created first.
all_first_records_qs = AccessRecord.objects.values_list('count_id') \
.annotate(max_id=Min('id')).values_list('max_id', flat=True)
# values_list returns a QuerySet, and thus lazy, which allows it to
# be used as a subquery
all_counts = Count.objects.filter(
accesses__user_id=2,
accesses__id__in=all_first_records_qs,
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.