相关疑难解决方法(0)

在Django Query中使用.extra(select = {...})引入的值上使用.aggregate()?

我试图计算一个玩家每周玩的次数如下:

player.game_objects.extra(
    select={'week': 'WEEK(`games_game`.`date`)'}
).aggregate(count=Count('week'))
Run Code Online (Sandbox Code Playgroud)

但是Django抱怨说

FieldError: Cannot resolve keyword 'week' into field. Choices are: <lists model fields>
Run Code Online (Sandbox Code Playgroud)

我可以在这样的原始SQL中做到这一点

SELECT WEEK(date) as week, COUNT(WEEK(date)) as count FROM games_game
WHERE player_id = 3
GROUP BY week
Run Code Online (Sandbox Code Playgroud)

如果没有在Django中执行原始SQL,有没有一个好方法呢?

python mysql django django-queryset django-aggregation

23
推荐指数
1
解决办法
9175
查看次数

Django ORM:按额外属性过滤

我想通过串联字符串过滤一些数据库对象.

正常的SQL查询将是:

SELECT concat(firstName, ' ', name) FROM person WHERE CONCAT(firstName, ' ', name) LIKE "a%";
Run Code Online (Sandbox Code Playgroud)

在模型中,我创建了一个名为PersonObjects的管理器:

class PersonObjects(Manager):
    attrs = { 
        'fullName': "CONCAT(firstName, ' ', name)"
    }   

    def get_query_set(self):
        return super(PersonObjects, self).get_query_set().extra(
            select=self.attrs)
Run Code Online (Sandbox Code Playgroud)

我也在我的模型中配置了这个:

objects = managers.PersonObjects()
Run Code Online (Sandbox Code Playgroud)

现在访问fullName适用于单个对象:

>>> p = models.Person.objects.get(pk=4)
>>> p.fullName
u'Fred Borminski'
Run Code Online (Sandbox Code Playgroud)

但它在过滤器中不起作用:

>>> p = models.Person.objects.filter(fullName__startswith='Alexei')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.7/site-packages/django/db/models/manager.py", line 141, in filter
    return self.get_query_set().filter(*args, **kwargs)
  File "/usr/lib/python2.7/site-packages/django/db/models/query.py", line 550, in filter
    return self._filter_or_exclude(False, …
Run Code Online (Sandbox Code Playgroud)

python database django orm

12
推荐指数
1
解决办法
2万
查看次数