首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么django没有检测到我的表列?

为什么django没有检测到我的表列?
EN

Stack Overflow用户
提问于 2021-07-06 10:48:38
回答 2查看 383关注 0票数 1

我有个问题。我创建了名为"Flower“的模型,一切都很好,我可以创建新的”花“,可以从它们获得数据等等。问题是,当我想在SQL查询中使用列"owner_id”时,我发现了一个错误,尽管我可以使用它从对象获取数据(例如flower1.owner_id)。我删除了我的sqlite数据库几次,进行了新的迁移,并使用了迁移,但仍然不能工作,我也更改了专栏的名称并重新创建了它,但这仍然没有帮助。

我的models.py:

代码语言:javascript
复制
from django.db import models
from django.contrib.auth.models import User

class Flower(models.Model):
name = models.CharField(max_length=80)
water_time = models.IntegerField()
owner_id = models.ForeignKey(User, on_delete=models.CASCADE, default=1)


def __str__(self):
    return self.name

我的views.py (视图,我想使用它的地方):

代码语言:javascript
复制
class workspaceView(generic.DetailView):
template_name = 'floris/workspace.html'

def get_object(self):
    with connection.cursor() as cursor:
        cursor.execute(f'SELECT id,name  FROM floris_Flower WHERE owner_id = {self.request.user.id}')
        row = cursor.fetchall()
    object = row
    print(object)
    if self.request.user.id == object.id:
        return object
    else:
        print('Error')

我的urls.py:

代码语言:javascript
复制
from django.urls import path

from . import views

urlpatterns = [
    path('', views.index2, name='index2'),
    path('login/', views.loginView, name='login'),
    path('register/', views.register, name='register'),
    path('addflower/', views.AddPlantView, name='addflower'),
    path('index.html', views.logout_view, name='logout'),
    path('workspace/', views.workspaceView.as_view(), name='workspace'),
    path('profile/<str:username>/', views.ProfileView.as_view(), name='profile'),
    
]

我的错误代码是:

代码语言:javascript
复制
OperationalError at /floris/workspace/
no such column: owner_id
Request Method: GET
Request URL:    http://127.0.0.1:8000/floris/workspace/
Django Version: 3.2.4
Exception Type: OperationalError
Exception Value:    
no such column: owner_id
Exception Location: /home/stazysta-kamil/.local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py, line 421, in execute
Python Executable:  /usr/bin/python3
Python Version: 3.8.10
Python Path:    
['/home/stazysta-kamil/Desktop/floris/mysite',
 '/usr/lib/python38.zip',
 '/usr/lib/python3.8',
 '/usr/lib/python3.8/lib-dynload',
 '/home/stazysta-kamil/.local/lib/python3.8/site-packages',
 '/usr/local/lib/python3.8/dist-packages',
 '/usr/lib/python3/dist-packages']
Server time:    Tue, 06 Jul 2021 10:43:32 +0000
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-06 10:55:28

由于owner_id被声明为ForeignKey,它将在实际的owner_id_id数据库中可用。Django自动为该关系字段添加附加前缀_id。使用Django ORM时,您只需通过owner_id访问它,然后Django将在后台为您自动处理事务,但是如果您使用的是raw owner_id_id命令,则必须使用实际的表列名,即owner_id_id。如果您不想要这样的行为,请使用您想要的确切名称(例如,db_column )来设置模型字段的owner_id = models.ForeignKey(User, on_delete=models.CASCADE, default=1, db_column="owner_id")

如Django文件所述:

在幕后的

中,Django将"_id“附加到字段名,以创建其数据库列名。在上面的示例中,Car模型的数据库表将有一个manufacturer_id列。

相关参考资料:

票数 1
EN

Stack Overflow用户

发布于 2021-07-06 11:29:37

该问题存在于花卉模型的"owner_id“领域。在模型中定义外键时,无需在末尾添加"_id“,因为Django会自动添加它

在这种情况下,应该足够替换

代码语言:javascript
复制
owner_id = models.ForeignKey(User, on_delete=models.CASCADE, default=1)

使用

代码语言:javascript
复制
owner = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68269165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档