尝试在 Django 中的 raw() 查询中检索数据时没有此类列错误
no such column error when trying to retrieve data in raw() Query in Django
我的 models.py
中有以下 类
class Users(models.Model):
username = models.CharField('User Name', null=False, max_length = 50)
password = models.CharField('User Password', max_length=50)
def __str__(self):
return self.username
class Photo(models.Model):
name = models.CharField(max_length=100, default="Image")
id = models.AutoField(primary_key=True)
uploader = models.ForeignKey(Users, default=None, on_delete=models.CASCADE)
def __str__(self):
return self.name
class Photo_History(models.Model):
image = models.ImageField(upload_to="media/results")
upload_time = models.DateTimeField(auto_now_add=True, blank=True)
photo_id = models.ForeignKey(Photo, null=True, blank=True, on_delete=models.CASCADE)
Table结构如下,
对于 用户 Class,
username
password
abc
123
dec
123
john
123
对于照片 Class,
id
name
uploader (foreign key)
1
first
abc
2
second
abc
3
third
dec
对于照片历史 Class,
image
upload_time
photo_id (foreign key)
img
12-01-2022
1
img
12-03-2022
1
img
12-04-2022
3
img
12-05-2022
2
我想要访问的是,用户已登录。我需要从当前登录用户的 Photo
模型中获取照片历史对象以及“名称”。
所以,假设用户 abc 已登录,那么它应该显示以下结果,
name
img
upload_time
first
img
12-01-2022
first
img
12-03-2022
second
img
12-05-2022
我试图搜索一种使用 filter
函数编写命令的方法来获取此命令,但我找不到任何结果来说明如何在单个查询中从两个不同的表中获取数据。相反,人们提到我应该使用 raw()
查询。
所以我使用了我认为完全没问题的原始查询,但是我收到了一个奇怪的错误(如果你没有在你的迁移中完成,你会得到这个错误,但是我的迁移很久以前就完成了 显示错误的列,我可以在其他查询中轻松地从中检索数据)
这是我的查询功能,
def history(request):
if request.session.has_key('is_logged'):
current_user_id= request.session['user_id']
q = "select p.name, h.image, h.upload_time from firstApp_Photo_History h, firstApp_Photo p where p.uploader=%s;"
photos = Photo_History.objects.raw(q, [str(Users.objects.filter(username=current_user_id)[0])])
print("Photos: ", photos)
for p in photos:
print(p.name)
print(p.username)
print(p.upload_time)
return render(request, 'history.html', {'ID':current_user_id, 'photos':photos})
else:
return redirect('login')
当我尝试 运行 这个时,我得到一个错误
no such column: p.uploader
谁能告诉我这是什么问题,我该如何解决?
这是完整的错误,
Quit the server with CTRL-BREAK.
Photos: <RawQuerySet: select p.name, h.image, h.upload_time from firstApp_Photo_History h, firstApp_Photo p where p.uploader=hassan;>
Internal Server Error: /history
Traceback (most recent call last):
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\sqlite3\base.py", line 416, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such column: p.uploader
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "E:\Hassan\Semester 8\Research\Example2\imageNetProject\firstApp\views.py", line 67, in history
for p in photos:
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\models\query.py", line 1514, in __iter__
self._fetch_all()
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\models\query.py", line 1501, in _fetch_all
self._result_cache = list(self.iterator())
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\models\query.py", line 1524, in iterator
query = iter(self.query)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\models\sql\query.py", line 96, in __iter__
self._execute_query()
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\models\sql\query.py", line 136, in _execute_query
self.cursor.execute(self.sql, params)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\utils.py", line 99, in execute
return super().execute(sql, params)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\utils.py", line 67, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\utils.py", line 76, in _execute_with_wrappers
return executor(sql, params, many, context)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\sqlite3\base.py", line 416, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such column: p.uploader
[24/Apr/2022 04:14:04] "GET /history HTTP/1.1" 500 128502
翻阅 Django 文档,我发现 Django 在外键名称的末尾添加了一个 _id
。
因此,我可以通过将 p.uploader
更改为 p.uploader_id
来解决我的问题。一个奇怪的问题,但这就是 Django 模型的工作方式。
最终查询是,
q = "select h.id, p.name, h.image, h.upload_time from firstApp_Photo_History h, firstApp_Photo p where p.uploader_id=%s;"
我的 models.py
class Users(models.Model):
username = models.CharField('User Name', null=False, max_length = 50)
password = models.CharField('User Password', max_length=50)
def __str__(self):
return self.username
class Photo(models.Model):
name = models.CharField(max_length=100, default="Image")
id = models.AutoField(primary_key=True)
uploader = models.ForeignKey(Users, default=None, on_delete=models.CASCADE)
def __str__(self):
return self.name
class Photo_History(models.Model):
image = models.ImageField(upload_to="media/results")
upload_time = models.DateTimeField(auto_now_add=True, blank=True)
photo_id = models.ForeignKey(Photo, null=True, blank=True, on_delete=models.CASCADE)
Table结构如下,
对于 用户 Class,
username | password |
---|---|
abc | 123 |
dec | 123 |
john | 123 |
对于照片 Class,
id | name | uploader (foreign key) |
---|---|---|
1 | first | abc |
2 | second | abc |
3 | third | dec |
对于照片历史 Class,
image | upload_time | photo_id (foreign key) |
---|---|---|
img | 12-01-2022 | 1 |
img | 12-03-2022 | 1 |
img | 12-04-2022 | 3 |
img | 12-05-2022 | 2 |
我想要访问的是,用户已登录。我需要从当前登录用户的 Photo
模型中获取照片历史对象以及“名称”。
所以,假设用户 abc 已登录,那么它应该显示以下结果,
name | img | upload_time |
---|---|---|
first | img | 12-01-2022 |
first | img | 12-03-2022 |
second | img | 12-05-2022 |
我试图搜索一种使用 filter
函数编写命令的方法来获取此命令,但我找不到任何结果来说明如何在单个查询中从两个不同的表中获取数据。相反,人们提到我应该使用 raw()
查询。
所以我使用了我认为完全没问题的原始查询,但是我收到了一个奇怪的错误(如果你没有在你的迁移中完成,你会得到这个错误,但是我的迁移很久以前就完成了 显示错误的列,我可以在其他查询中轻松地从中检索数据)
这是我的查询功能,
def history(request):
if request.session.has_key('is_logged'):
current_user_id= request.session['user_id']
q = "select p.name, h.image, h.upload_time from firstApp_Photo_History h, firstApp_Photo p where p.uploader=%s;"
photos = Photo_History.objects.raw(q, [str(Users.objects.filter(username=current_user_id)[0])])
print("Photos: ", photos)
for p in photos:
print(p.name)
print(p.username)
print(p.upload_time)
return render(request, 'history.html', {'ID':current_user_id, 'photos':photos})
else:
return redirect('login')
当我尝试 运行 这个时,我得到一个错误
no such column: p.uploader
谁能告诉我这是什么问题,我该如何解决?
这是完整的错误,
Quit the server with CTRL-BREAK.
Photos: <RawQuerySet: select p.name, h.image, h.upload_time from firstApp_Photo_History h, firstApp_Photo p where p.uploader=hassan;>
Internal Server Error: /history
Traceback (most recent call last):
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\sqlite3\base.py", line 416, in execute
return Database.Cursor.execute(self, query, params)
sqlite3.OperationalError: no such column: p.uploader
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "E:\Hassan\Semester 8\Research\Example2\imageNetProject\firstApp\views.py", line 67, in history
for p in photos:
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\models\query.py", line 1514, in __iter__
self._fetch_all()
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\models\query.py", line 1501, in _fetch_all
self._result_cache = list(self.iterator())
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\models\query.py", line 1524, in iterator
query = iter(self.query)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\models\sql\query.py", line 96, in __iter__
self._execute_query()
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\models\sql\query.py", line 136, in _execute_query
self.cursor.execute(self.sql, params)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\utils.py", line 99, in execute
return super().execute(sql, params)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\utils.py", line 67, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\utils.py", line 76, in _execute_with_wrappers
return executor(sql, params, many, context)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\utils.py", line 90, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\utils.py", line 85, in _execute
return self.cursor.execute(sql, params)
File "E:\Hassan\Semester 8\Research\Example2\venv\lib\site-packages\django\db\backends\sqlite3\base.py", line 416, in execute
return Database.Cursor.execute(self, query, params)
django.db.utils.OperationalError: no such column: p.uploader
[24/Apr/2022 04:14:04] "GET /history HTTP/1.1" 500 128502
翻阅 Django 文档,我发现 Django 在外键名称的末尾添加了一个 _id
。
因此,我可以通过将 p.uploader
更改为 p.uploader_id
来解决我的问题。一个奇怪的问题,但这就是 Django 模型的工作方式。
最终查询是,
q = "select h.id, p.name, h.image, h.upload_time from firstApp_Photo_History h, firstApp_Photo p where p.uploader_id=%s;"