簡體   English   中英

Django 過濾相關模型屬性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM