0

假设我有两个模型:

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

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

我怎样才能找到在周末(周日和周六)比在一周中的其他日子有更多操作的所有用户,反之亦然?

编辑:我不需要为一个用户检查这个条件,这很容易。我需要选择所有满足这些条件之一的用户。

4

1 回答 1

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 以外的后端,语法可能略有不同。您当然应该根据您的情况更改表名和列名。

于 2013-07-26T00:20:42.623 回答