OuterRefを使用する非常に単純なサブクエリを作成しようとしていますが(実用的ではありません)、同じエラーが発生しています。最後の2行は、各ポストのオブジェクトのために私にタグの数を与える必要があります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シェルコード
>>> 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()))
。そして、ここで私は同じエラーを取得しておく:あなたの例で問題の
ValueError: This queryset contains a reference to an outer query and may only be used in a subquery.
おかげで、ということ働いた!しかし、 'pk__in = [1,2]'をTagフィルタに追加すると 'django.core.exceptions.FieldError:Expressionには混合型が含まれています。 output_field'を設定する必要があります。 – mjuk
'queryset.query'を表示して' RDBMS'で直接実行して、何を返すのかを見ることができます。私はいくつかの行 'Count'は0ではなくNULLを返すかもしれないと思います。一時的に行を除外して、すなわち.filter(count__gte = 1)を確認することができます。しかし、 'Subquery'は2番目の引数を受け取ります。これは' output_field'です。 'output_field = fields.IntegerField()' – Todor
に感謝します。 – mjuk