Lorsque j'utilise extra
d'une certaine manière sur un Django queryset (appeler qs
), le résultat de qs.count()
est différent de celui len(qs.all())
. Pour reproduire:`la count` de queryset est erroné après` extra`
Faire un projet vide Django et l'application, puis ajouter un modèle trivial:
class Baz(models.Model):
pass
maintenant faire quelques objets:
>>> Baz(id=1).save()
>>> Baz(id=2).save()
>>> Baz(id=3).save()
>>> Baz(id=4).save()
En utilisant la méthode extra
pour sélectionner seulement quelques-uns des les produit le nombre prévu:
>>> Baz.objects.extra(where=['id > 2']).count()
2
>>> Baz.objects.extra(where=['-id < -2']).count()
2
Mais ajouter un select
clause extra
et y faire référence dans la clause where
, et le compte est soudainement mal, même si le résultat de all()
est correcte:
>>> Baz.objects.extra(select={'negid': '0 - id'}, where=['"negid" < -2']).all()
[<Baz: Baz object>, <Baz: Baz object>] # As expected
>>> Baz.objects.extra(select={'negid': '0 - id'}, where=['"negid" < -2']).count()
0 # Should be 2
Je pense que le problème a à voir avec django.db.models.sql.query.BaseQuery.get_count()
. Il vérifie si les attributs select
ou aggregate_select
de BaseQuery ont été définis; Si c'est le cas, il utilise une sous-requête. Mais django.db.models.sql.query.BaseQuery.add_extra
ajoute seulement à l'attribut extra
de BaseQuery, pas select
ou aggregate_select
.
Comment puis-je résoudre le problème? Je sais que je pourrais juste utiliser len(qs.all())
, mais ce serait bien de pouvoir passer le jeu de requête extra
à d'autres parties du code, et ces parties peuvent appeler count()
sans savoir qu'il est cassé.
Vérifié que le problème est toujours présent dans Django 1.2.1. –