Opened 15 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))

Change History (0)

Note: See TracTickets for help on using tickets.
Back to Top