Django得到答案

时间:2017-03-05 15:31:37

标签: django django-queryset

我有一个Post模型:

class Post(models.Model):
  poster = models.ForeignKey('auth.User')
  question = models.ForeignKey('self', null=True, blank=True)

  post_title = models.CharField(max_length=300)
  post_content = models.TextField(null=True, blank=True)

  is_question = models.BooleanField(default=True)
  .
  .
  .
  created_date = models.DateTimeField(
    default=timezone.now)

  def __str__(self):
      return self.post_title

这将是问答网站,就像SO一样。

如果这篇文章是一个问题,' is_question '将成立。 否则,如果帖子是答案,“问题”字段将引用帖子的ID,即问题,“ is_question ”将为false。

简单,对。

现在我试图获得所有问题和相关答案,这可能是一个或几个查询(不使用for循环)吗?

以下过滤器仅返回问题和一些相关内容(如upvotes,views,post tags的数量):

posts = Post.objects.filter(
    created_date__lte=timezone.now(),
    is_question=1,
    is_published=1
).order_by(
    '-created_date',
).prefetch_related(
    Prefetch('vote_set', queryset=Vote.objects.filter(
        user=request.user, date_voted__gte=dt_aware), to_attr='user_voted')
).prefetch_related(
    Prefetch('tags', to_attr='tagss')
).annotate(total_votes=Coalesce(Sum('vote__vote_type'),0)
).annotate(views_num = Count('questionvieaw', distinct=True)
).select_related()

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案。已经有一个post_set对象我检查了它,这是答案(我认为这是由于模型中的问题属性)。

所以这是最后的查询:

posts = Post.objects.filter(
    created_date__lte=timezone.now(),
    is_question=1,
    is_published=1
).order_by(
    '-created_date',
).prefetch_related(
    Prefetch('vote_set', queryset=Vote.objects.filter(
        user=request.user, date_voted__gte=dt_aware), to_attr='user_voted')
).prefetch_related(
    Prefetch('post_set', queryset=Post.objects.filter(
        is_question=0), to_attr='answers')
).prefetch_related(
    Prefetch('tags', to_attr='tagss')
).annotate(total_votes=Coalesce(Sum('vote__vote_type'),0)
).annotate(views_num = Count('questionvieaw', distinct=True)
).select_related()