2016-03-02 118 views
1

所以我搜索了这个到目前为止还找不到任何答案。 我在那里的时候,我已经把在数据库:Django Views中的嵌套SQL查询

SELECT event_name, team_number 
FROM teams_by_event 
WHERE team_number IN (SELECT team_number 
        FROM teams_by_event 
        WHERE event_name = '[user inputs event name]' 
        ) ORDER BY team_number; 

它给了我正是我要找的回报。 我的问题是,我想不出在Django视图中执行此操作的方法,以及我尝试过的方法,只是在Django中使用原始SQL也无法正常工作,但我得到一个语法错误,指出上一个括号SQL查询无效。

views.py:

def teams_by_event(request, shorthand): 
    code = TeamsByEvent.objects.filter(shorthand=shorthand) 
    for event in TeamsByEvent.objects.raw('SELECT event_name, team_number \ 
           FROM teams_by_event \ 
           WHERE team_number IN \ 
           (SELECT team_number \ 
           FROM teams_by_event) \ 
           WHERE shorthand= % s', [code]) 
    print (event.team_number, event.event_name) 
    return render(request, 'event-info.html', {'info': info}) 

models.py

class TeamsByEvent(models.Model): 
    team_number = models.IntegerField() 
    event_name = models.CharField(max_length=50) 
    shorthand = models.CharField(max_length=12) 

    class Meta: 
     db_table = 'teams_by_event' 
     app_label = 'frcstats' 

编辑:: 回溯:

Traceback (most recent call last): 
    File "/Users/alicen/git/first_robotics/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 149, in get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "/Users/alicen/git/first_robotics/venv/lib/python2.7/site-packages/django/core/handlers/base.py", line 147, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/Users/alicen/git/first_robotics/frcstats/views.py", line 1034, in teams_by_event 
    for event in TeamsByEvent.objects.raw(raw_query): 
    File "/Users/alicen/git/first_robotics/venv/lib/python2.7/site-packages/django/db/models/query.py", line 1219, in __iter__ 
    query = iter(self.query) 
    File "/Users/alicen/git/first_robotics/venv/lib/python2.7/site-packages/django/db/models/sql/query.py", line 79, in __iter__ 
    self._execute_query() 
    File "/Users/alicen/git/first_robotics/venv/lib/python2.7/site-packages/django/db/models/sql/query.py", line 113, in _execute_query 
    self.cursor.execute(self.sql, params) 
    File "/Users/alicen/git/first_robotics/venv/lib/python2.7/site-packages/django/db/backends/utils.py", line 79, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "/Users/alicen/git/first_robotics/venv/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "/Users/alicen/git/first_robotics/venv/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 322, in execute 
    query = self.convert_query(query) 
    File "/Users/alicen/git/first_robotics/venv/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 330, in convert_query 
    return FORMAT_QMARK_REGEX.sub('?', query).replace('%%', '%') 
TypeError: expected string or buffer 
+0

我可以看到你的models.py? – arcegk

+0

@arcegk - 已编辑为我的models.py添加该表 – alicen

+0

您已在'%s'内有额外的空间,并且在已指出的错误位置处有一个右括号。 – serg

回答

0

看来你把)在错误的位置。它不应该像跟随?

def teams_by_event(request, shorthand): 
    code = TeamsByEvent.objects.filter(shorthand=shorthand) 
    raw_query = '''SELECT event_name, team_number 
        FROM teams_by_event 
        WHERE team_number IN (
        SELECT team_number FROM teams_by_event 
        WHERE shorthand = % s)''' % [code] 

    for event in TeamsByEvent.objects.raw(raw_query): 
     print (event.team_number, event.event_name) 

    return render(request, 'event-info.html', {'info': info}) 
+0

我也尝试过,我也遇到同样的错误 - @jbacker – alicen

+0

@alicen,你现在可以试试吗?我已更新它。 – jbacker

+0

我不得不添加一些括号,并删除第二个%,但它给了我一个新的错误:“预期的字符串或缓冲区” – alicen

0

尝试做两个独立的查询:

subquery = TeamByEvent.objects.filter(event_name__icontains='input').\ 
values_list('team_number' , flat=True) 

query = TeamByEvent.objects.filter(team_number__in=subquery) 
1

看到你的表结构(即模型)和查询,我敢肯定,你不需要嵌套查询的。您的疑问:

SELECT event_name, team_number 
FROM teams_by_event 
WHERE team_number IN (SELECT team_number 
        FROM teams_by_event 
        WHERE event_name = '[user inputs event name]' 
        ) ORDER BY team_number; 

应返回正是下面的查询结果:

SELECT event_name, team_number 
FROM teams_by_event 
WHERE event_name = '[user inputs event name]' ORDER BY team_number; 

和等效Django的查询会是这样的:

TeamsByEvent.objects.filter(event_name='your_event_name') 
+0

我不认为你完全明白我在做什么。 我想输入一个事件,取回所有球队号码,然后返回每个球队号码也与之相关的所有事件。一些团队号码将有3个事件相关联,其他人将只有一个 – alicen