[英]Querying PostgreSQL database (with Django) for only objects with relations
我目前正在通過官方教程學習 Django,並決定嘗試添加一些額外的功能和測試,如建議here 。
我現在在數據庫中有兩個模型,它們基本上是這樣的:
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
我設置了一個視圖來顯示問題列表。 我想要做的是為視圖創建一個查詢,該查詢將只包含具有關聯選項的問題對象。 任何沒有相關選擇對象的問題對象都不應包含在結果集中。 此查詢還會忽略未來的問題並對它們進行排序,但該部分很好,並且在教程之外。
這是我到目前為止想到的。 它似乎有效,但我不禁認為我已經以一種非常落后和低效的方式完成了它。 是否可以進行一個查詢來處理數據庫中的所有內容,而不是兩個查詢和一個列表理解?
choices = Choice.objects.prefetch_related(
'question').distinct('question')
question_ids = [x.question.id for x in choices]
return Question.objects.filter(
id__in=question_ids).filter(
pub_date__lte=timezone.now()).order_by('-pub_date')[:5]
您可以通過與其關聯的Choice
對象的計數來注釋Question
,然后排除計數為零的那些:
from django.db.models import Count
questions = Question.objects \
.annotate(choice_cnt=Count('choice')) \
.exclude(choice_cnt=0) \
.filter(pub_date__lte=timezone.now()) \
.order_by('-pub_date')[:5]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.