OuterRef'i (pratik amaçlarla değil, yalnızca çalışmasını sağlamak için) kullanan çok basit bir alt sorgu oluşturmaya çalışıyorum, ancak aynı hatayla çalışmaya devam ediyorum.OuterRef ile basit bir alt sorgu
mesaj/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 kabuk kodu
>>> 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()))
son iki satır bana her Mesaj nesnesi için etiket sayısını vermelidir. Ve burada ben aynı hatayı almaya devam: En örnekle sorunların
ValueError: This queryset contains a reference to an outer query and may only be used in a subquery.
Teşekkür ki çalıştı! Ancak, Tag filtresine 'pk__in = [1,2]' eklediğimde, django.core.exceptions.FieldError 'ı alıyorum: İfade karma tipler içeriyor. Output_field 'ayarlamalısınız. – mjuk
“queryset.query” yi yazdırmayı ve karşılığında ne aldığınızı görmek için doğrudan 'RDBMS'nizde çalıştırabilirsiniz. Sanırım bazı satırlar için "Count", 0 yerine "NULL" döndürüyor olabilir. Bunu, satır sonu sayımını, yani .filter (count__gte = 1) 'yi hariç tutmayı onaylayabilirsiniz.Ancak, 'Subquery' ikinci bir argümanı kabul eder, yani 'output_field' 'den şunu deneyebilirsiniz: 'output_field = fields.IntegerField()' – Todor
teşekkürler, tam ihtiyacım olan şey budur. – mjuk