假设我有两个模型:
class User(models.Model):
name = CharField(max_length=42)
class Action(models.Model):
user = models.ForeignKey(User)
timestamp = models.DateTimeField(auto_now_add=True)
如何找到周末(周日和周六)比周末更多行动的所有用户,反之亦然?
编辑:我不需要为一个用户检查这个条件,这很容易。我需要选择其中一个条件成立的所有用户。
答案 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以外的后端,语法可能略有不同。您当然应该根据您的情况更改表格和列名。