ich eine sehr einfachen Unterabfrage zu machen versuchen, die OuterRef verwendet (nicht für praktische Zwecke, nur um es in Betrieb), sondern hält in gleiche Fehler ausgeführt wird.Einfacher Subquery mit OuterRef
Beiträge/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-Code
>>> 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()))
Die letzten beiden Zeilen Anzahl der Tags für jedes Objekt Beitrag geben Sie mir sollte. Und hier halte ich den gleichen Fehler:
ValueError: This queryset contains a reference to an outer query and may only be used in a subquery.
Danke, dass hat funktioniert! Wenn ich jedoch 'pk__in = [1,2]' zum Tag-Filter hinzufüge, bekomme ich 'django.core.exceptions.FieldError: Expression enthält gemischte Typen. Sie müssen Ausgabefeld setzen. – mjuk
Sie können versuchen, den 'queryset.query' zu drucken, und führen Sie es in Ihrem' RDBMS' direkt zu sehen, was man bekommt. Ich denke, dass für einige Zeilen 'Count' zurückgeben' NULL' statt 0 können Sie versuchen, zu bestätigen, dass durch temporäre ausschließen Reihen w/o Zahl, das heißt '.filter (count__gte = 1)'."Subquery" akzeptiert jedoch ein zweites Argument, das 'output_field' ist, das Sie versuchen können, es zu setzen:' output_field = fields.IntegerField() ' – Todor
Danke, das ist genau das, was ich brauchte. – mjuk