Próbuję zrobić bardzo proste Podkwerendę, która używa OuterRef (nie w celach praktycznych, tylko po to, aby działało), ale nadal działają na ten sam błąd.Proste podkwerendy z OuterRef
postów/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
kod 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()))
Ostatnie dwie linie powinny dać mi liczbę tagów dla każdego obiektu post. A tu wciąż otrzymuję ten sam błąd:
ValueError: This queryset contains a reference to an outer query and may only be used in a subquery.
Dzięki, że pracował! Jednak gdy dodaję 'pk__in = [1,2]' do filtra Tag, otrzymuję 'django.core.exceptions.FieldError: Expression zawiera typy mieszane. Musisz ustawić output_field'. – mjuk
Możesz spróbować wydrukować 'queryset.query' i wykonać je w swoim' RDBMS' bezpośrednio, aby zobaczyć, co otrzymasz w zamian. Sądzę, że dla niektórych wierszy 'Count' może zwracać' NULL' zamiast 0. Możesz spróbować potwierdzić, że przez tymczasowe wykluczenie wierszy bez liczenia, tj. '.filter (count__gte = 1)'.Jednak "Podzaprocesowanie" akceptuje drugi argument, który jest "output_field", możesz spróbować ustawić go na: 'output_field = fields.IntegerField()' – Todor
dzięki, to dokładnie to, czego potrzebowałem. – mjuk