Opened 16 years ago
Last modified 13 years ago
#10723 closed
ORM exclute strange — at Initial Version
Reported by: | anonymous | Owned by: | nobody |
---|---|---|---|
Component: | Database layer (models, ORM) | Version: | dev |
Severity: | Keywords: | ||
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
My models is:
class Type(models.Model): id = models.AutoField(primary_key=True) slug = models.SlugField(unique=True, max_length=10) title = models.CharField(max_length=20) weight = models.SmallIntegerField(default=0, db_index=True) class Active(models.Model): post = models.ForeignKey(Post, related_name='activeposts') rubrica = models.ForeignKey(Rubrica, related_name='activeposts') type = models.ForeignKey(Type, related_name='activeposts') user_id = models.PositiveIntegerField() pub_date = models.DateTimeField(default=datetime.now)
Type.objects.filter(Q(activeposts__rubrica__pk=112) & Q(activeposts__user_id__in=[1,2,3])).annotate(count=Count('activeposts')).query.as_sql()
Result is correct:
('SELECT `doska_type`.`id`, `doska_type`.`slug`, `doska_type`.`weight`, COUNT(`doska_active_new`.`id`) AS `count` FROM `doska_type` LEFT OUTER JOIN `doska_active_new` ON (`doska_type`.`id` = `doska_active_new`.`type_id`) WHERE (`doska_active_new`.`rubrica_id` = %s AND `doska_active_new`.`user_id` IN (%s, %s, %s)) GROUP BY `doska_type`.`id` ORDER BY `doska_type`.`weight` ASC', (112, 1, 2, 3))
But
Type.objects.filter(Q(activeposts__rubrica__pk=112) & ~Q(activeposts__user_id__in=[1,2,3])).annotate(count=Count('activeposts')).query.as_sql()
Result is not correct:
('SELECT `doska_type`.`id`, `doska_type`.`slug`, `doska_type`.`weight`, COUNT(`doska_active_new`.`id`) AS `count` FROM `doska_type` LEFT OUTER JOIN `doska_active_new` ON (`doska_type`.`id` = `doska_active_new`.`type_id`) WHERE (`doska_active_new`.`rubrica_id` = %s AND NOT (`doska_type`.`id` IN (SELECT U1.`type_id` FROM `doska_active_new` U1 WHERE U1.`user_id` IN (%s, %s, %s)))) GROUP BY `doska_type`.`id` ORDER BY `doska_type`.`weight` ASC', (112, 1, 2, 3))
Note:
See TracTickets
for help on using tickets.