En cuanto a la función add_aggregate
dentro de django/db/models/sql/query.py
, los objetos de consulta no se aceptarán como valores de entrada.
Desafortunadamente, actualmente no hay una forma directa dentro de Django para agregar/anotar en lo que equivale a un conjunto de preguntas, especialmente no uno que se filtra de alguna manera.
Suponiendo los siguientes modelos:
class Item(models.Model):
name = models.CharField(max_length=32)
class Tag(models.Model):
itemfk = models.ForeignKey(Item, related_name='tags')
name = models.CharField(max_length=32)
class FavoritedTag(models.Model):
user = models.ForeignKey(User)
tag = models.ForeignKey(Tag)
Además, no se pueden anotar un conjunto de consultas en los campos definidos a través de .extra()
.
Uno podría caer en SQL en views.py
así:
from testing.models import Item, Tag, FavoritedTag
from django.shortcuts import render_to_response
from django.contrib.auth.decorators import login_required
from django.utils.datastructures import SortedDict
@login_required
def interest_level(request):
ruid = request.user.id
qs = Item.objects.extra(
select = SortedDict([
('interest_level', 'SELECT COUNT(*) FROM testing_favoritedtag, testing_tag \
WHERE testing_favoritedtag.user_id = %s \
AND testing_favoritedtag.tag_id = testing_tag.id \
AND testing_tag.itemfk_id = testing_item.id'),
]),
select_params = (str(ruid),)
)
return render_to_response('testing/interest_level.html', {'qs': qs})
Plantilla:
{% for item in qs %}
name: {{ item.name }}, level: {{ item.interest_level }}<br>
{% endfor %}
Probé esto utilizando MySQL5. Sin embargo, dado que no soy experto en SQL, me gustaría saber cómo optimizar aquí, o si hay otra forma de "disminuir" la cantidad de SQL. ¿Tal vez hay alguna forma interesante de utilizar la característica related_name
aquí directamente en SQL?
¿Aparece un mensaje de error? ¿Podría proporcionar los modelos con los que está trabajando? – cethegeek
el error es "excepción 'Q' objeto no tiene atributo 'división'", geradeausanwalt es correcto agregación funcs no toman objetos Q como argumentos. Los modelos en su respuesta son similares a los míos. – Evgeny