我試圖做一個使用OuterRef的非常簡單的子查詢(不是爲了實際目的,只是爲了讓它工作),而是一直運行到相同的錯誤。使用OuterRef的簡單子查詢
帖子/ models.py
from django.db import models
class Tag(models.Model):
name = models.CharField(max_length=120)
def __str__(self):
return self.name
class Post(models.Model):
title = models.CharField(max_length=120)
tags = models.ManyToManyField(Tag)
def __str__(self):
return self.title
manage.py shell代碼
>>> from django.db.models import OuterRef, Subquery
>>> from posts.models import Tag, Post
>>> tag1 = Tag.objects.create(name='tag1')
>>> post1 = Post.objects.create(title='post1')
>>> post1.tags.add(tag1)
>>> Tag.objects.filter(post=post1.pk)
<QuerySet [<Tag: tag1>]>
>>> tags_list = Tag.objects.filter(post=OuterRef('pk'))
>>> Post.objects.annotate(count=Subquery(tags_list.count()))
最後兩行應該給我的每一個Post對象的標籤數量。在這裏,我不斷收到同樣的錯誤:
ValueError: This queryset contains a reference to an outer query and may only be used in a subquery.
謝謝,成功了!但是,當我將'pk__in = [1,2]'添加到標記過濾器時,我得到'django.core.exceptions.FieldError:表達式包含混合類型。你必須設置output_field'。 – mjuk
您可以嘗試打印'queryset.query'並直接在您的'RDBMS'中執行以查看您獲得的回報。我猜測對於某些行,Count可能返回NULL而不是0.您可以嘗試通過臨時排除無數行的行來確認,即'.filter(count__gte = 1)'。然而,'Subquery'接受第二個參數,它是'output_field',你可以嘗試將它設置爲:'output_field = fields.IntegerField()' – Todor
謝謝,這是我所需要的。 – mjuk