Django查询:周末或工作日更多

时间:2013-07-25 17:58:29

标签: python django django-queryset

假设我有两个模型:

class User(models.Model):
    name = CharField(max_length=42)

class Action(models.Model):
    user = models.ForeignKey(User)
    timestamp = models.DateTimeField(auto_now_add=True)

如何找到周末(周日和周六)比周末更多行动的所有用户,反之亦然?

编辑:我不需要为一个用户检查这个条件,这很容易。我需要选择其中一个条件成立的所有用户。

1 个答案:

答案 0 :(得分:2)

这可以使用额外方法在一个查询中完成,在WHERE子句中传递自定义语句。此MySQL示例选择周末期间操作数小于或等于其他日期操作数的所有用户:

f = {
    'user_table': User._meta.db_table,
    'action_table': Action._meta.db_table,
    'user_id': User._meta.pk.get_attname_column()[1],
    'user_fk': Action._meta.get_field('user').get_attname_column()[1],
    'timestamp': Action._meta.get_field('timestamp').get_attname_column()[1],
}

query = "(SELECT COUNT(*) FROM %(action_table)s \
    WHERE %(action_table)s.%(user_fk)s = %(user_table)s.%(user_id)s \
    AND DAYOFWEEK(%(action_table)s.%(timestamp)s IN (1,7)) \
    <= (SELECT COUNT(*) FROM %(action_table)s \ 
    WHERE %(action_table)s.%(user_fk)s = %(user_table)s.%(user_id)s \
    AND DAYOFWEEK(%(action_table)s.%(timestamp)s) NOT IN (1,7))" % f
users = User.objects.extra(where=[query]))

对于除MySQL以外的后端,语法可能略有不同。您当然应该根据您的情况更改表格和列名。