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 쉘 코드는
>>> 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]'를 태그 필터에 추가하면'django.core.exceptions.FieldError : Expression에 혼합 유형이 포함됩니다. output_field'를 설정해야합니다. – mjuk
'queryset.query'를 출력하고'RDBMS'에서 직접 실행하여 여러분이 얻은 결과를 직접 볼 수 있습니다. 나는 어떤 행에 대해'Count'가 0 대신에'NULL'을 반환 할 것이라고 추측합니다. 행을 w/o하지 않은 행을 임시로 제외시킴으로써'.filter (count__gte = 1)'을 확인하려고 할 수 있습니다.그러나'Subquery'는 두 번째 인자 인'output_field'를 받아 들일 수 있습니다.'output_field = fields.IntegerField()' – Todor
감사합니다. 그것은 내가 필요한 것입니다. – mjuk