尝试在 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;"