Opened 15 years ago

Last modified 13 years ago

#10723 closed

ORM exclute strange — at Version 1

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 (last modified by Malcolm Tredinnick)

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 (1)

comment:1 by Malcolm Tredinnick, 15 years ago

Description: modified (diff)
milestone: 1.1
Triage Stage: UnreviewedAccepted

(Reformatted description to avoid lots of side-scrolling.)

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