8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

OperationalError,没有这样的列。Django

Juraj 2月前

236 0

我正在学习 http://www.django-rest-framework.org/ 上的 Django REST 框架教程,我几乎完成了它并刚刚添加了身份验证。现在我得到了 :OperationalError ...

我正在学习 http://www.django-rest-framework.org/ ,我几乎完成了它,并且刚刚添加了身份验证。现在我得到:

OperationalError at /snippets/
no such column: snippets_snippet.owner_id
Request Method: GET
Request URL:    http://localhost:8000/snippets/
Django Version: 1.7
Exception Type: OperationalError
Exception Value:    
no such column: snippets_snippet.owner_id
Exception Location: /Users/taylorallred/Desktop/env/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py in execute, line 485
Python Executable:  /Users/taylorallred/Desktop/env/bin/python
Python Version: 2.7.5
Python Path:    
['/Users/taylorallred/Desktop/tutorial',
 '/Users/taylorallred/Desktop/env/lib/python27.zip',
 '/Users/taylorallred/Desktop/env/lib/python2.7',
 '/Users/taylorallred/Desktop/env/lib/python2.7/plat-darwin',
 '/Users/taylorallred/Desktop/env/lib/python2.7/plat-mac',
 '/Users/taylorallred/Desktop/env/lib/python2.7/plat-mac/lib-scriptpackages',
 '/Users/taylorallred/Desktop/env/Extras/lib/python',
 '/Users/taylorallred/Desktop/env/lib/python2.7/lib-tk',
 '/Users/taylorallred/Desktop/env/lib/python2.7/lib-old',
 '/Users/taylorallred/Desktop/env/lib/python2.7/lib-dynload',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/Users/taylorallred/Desktop/env/lib/python2.7/site-packages']
Server time:    Sat, 11 Oct 2014 07:02:34 +0000

我已经在网上的几个地方查找过,不仅仅是在 StackOverflow 上寻找解决方案,一般来说,问题似乎出在我的数据库中,需要删除它然后重新创建,我已经这样做过好几次了,教程甚至让我删除数据库并在那时重新创建它。这是我的 models.py

from django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles
from pygments.lexers import get_lexer_by_name
from pygments.formatters.html import HtmlFormatter
from pygments import highlight


LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
STYLE_CHOICES = sorted((item, item) for item in get_all_styles())



class Snippet(models.Model):
    owner = models.ForeignKey('auth.User', related_name='snippets')
    highlighted = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    title = models.CharField(max_length=100, blank=True, default='')
    code = models.TextField()
    linenos = models.BooleanField(default=False)
    language = models.CharField(choices=LANGUAGE_CHOICES,
                                            default='python',
                                            max_length=100)
    style = models.CharField(choices=STYLE_CHOICES,
                                     default='friendly',
                                     max_length=100)
    class Meta:
        ordering = ('created',)
def save(self, *args, **kwargs):
    """
    Use the 'pygments' library to create a highlighted HTML
    representation of the code snippet.
    """
    lexer = get_lexer_by_name(self.language)
    linenos = self.linenos and 'table' or False
    options = self.title and {'title': self.title} or {}
    formatter = HtmlFormatter(style=self.style, linenos=linenos,
                                      full=true, **options)
    self.highlighted = highlight(self.code, lexer, formatter)
    super(Snippet, self).save(*args, **kwargs)

我的 serializers.py

from django.forms import widgets
from rest_framework import serializers
from snippets.models import Snippet, LANGUAGE_CHOICES, STYLE_CHOICES
from django.contrib.auth.models import User



class SnippetSerializer(serializers.ModelSerializer):
    owner = serializers.Field(source='owner.username')
    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos', 'language', 'style', 'owner')


class UserSerializer(serializers.ModelSerializer):
    snippets = serializers.PrimaryKeyRelatedField(many=True)


    class Meta:
        model = User
        fields = ('id', 'username', 'snippets')

我的 views.py

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework import generics
from django.contrib.auth.models import User
from snippets.serializers import UserSerializer
from rest_framework import permissions

class SnippetList(generics.ListCreateAPIView):
    """
    List all snippets, or create a new snippet.
    """
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    def pre_save(self, obj):
        obj.owner = self.request.user
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
    """
    Retrieve, update or delete a nippet instance.
    """
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    def pre_save(self, obj):
        obj.owner = self.request.user
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

class UserList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class UserDetail(generics.RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

最后我的 urls.py

from django.conf.urls import include
from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views


urlpatterns = patterns('',
    url(r'^snippets/$', views.SnippetList.as_view()),
    url(r'^snippets/(?P<pk>[0-9]+)/$', views.SnippetDetail.as_view()),
    url(r'^users/$', views.UserList.as_view()),
    url(r'^users/(?P<pk>[0-9]+)/$', views.UserDetail.as_view()),
)

urlpatterns = format_suffix_patterns(urlpatterns)

urlpatterns += patterns('',
    url(r'^api-auth/', include('rest_framework.urls',
                                       namespace='rest_framework')),
)

数据库架构:

CREATE TABLE "snippets_snippet" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, 
"created" datetime NOT NULL, "title" varchar(100) NOT NULL, "code" text NOT NULL, 
"linenos" bool NOT NULL, "language" varchar(100) NOT NULL, "style" varchar(100) NOT NULL);

经过一番挖掘之后,我发现当删除并重新创建数据库(正如教程所说)时,除了使用该 make migrations 命令之外,它不仅不会添加列,而且在运行命令时也不会告诉我出了什么问题, make migrations 它告诉我:

You are trying to add a non-nullable field 'highlighted' to snippet without a default;
we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows)
 2) Quit, and let me add a default in models.py

如果我注释掉其中 highlighted 的部分, models.py 它将发布与上面相同的消息,但针对的是 owner highlighted 的默认值 owner ,但我不确定要使用什么。以及教程也没有帮助我。

帖子版权声明 1、本帖标题:OperationalError,没有这样的列。Django
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Juraj在本站《database》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 保留 SQLite 数据库解决方案

    比如说我遇到了这个错误:

    django.db.utils.OperationalError:没有这样的列:shop_product.likes

    为了保留当前的 ​​SQLite 数据库,您可以执行以下步骤:

    1. p3

      sqlite3 db.sqlite3
    2. p4

      ALTER TABLE shop_product ADD COLUMN likes;
  • 好吧,我无法特别谈论该问题的数据库方面或答案......并且我尝试删除 0001_initial.py 但错误仍然存​​在。

    因此,对于你们(我们)在使用 django(不一定是 REST)时遇到“ 没有这样的列:snippets_snippet.owner_id ”类型的错误的人来说,问题出在外键变量上,它需要一个未指定的默认值。

    解决方案:添加 default='' 外键参数,这样就没问题了。有关此人代码的上下文; owner = models.ForeignKey('auth.User', related_name='snippets', default='')

  • 每当你添加一个新字段时,你也需要在数据库中进行更改,因此你需要运行一些命令来添加新列

    python manage.py makemigrations
    python manage.py migrate
    python manage.py runserver
    

    如果仍然不起作用,请删除名称以 00 或类似名称开头的迁移文件,然后运行上述相同的命令。如果仍然不起作用,请从项目中删除 SQLite 数据库,然后再次运行这些命令

  • 我添加此代码是因为,如果问题仍然存在,则可能是您尝试在 类的 init makemigrations 进程会检查您的所有模块和类,如果您尝试在 init 函数中访问数据库中的表,则可能会引发错误。注释掉该行,然后尝试 makemigrations 和迁移

  • 不要像有些人说的那样删除任何现有的迁移,而是执行以下操作:

    python manage.py migrate --fake #(only if the below commands don't work)
    python manage.py migrate --run-syncdb
    python manage.py runserver makemigrations
    python manage.py runserver
    
  • 我在 sqlite 中遇到了同样的问题。我的 models.py 看起来没问题。我做了以下事情:

    sqlite3 db.sqlite3
    .tables
    PRAGMA table_info(table_name);
    

    通过 PRAGMA,我能够看到表中缺少列。我删除了应用程序中的所有表。请小心,因为这会导致表中的数据丢失。

    DROP table table_name
    .quit
    

    然后执行以下操作:

    python manage.py makemigrations your_app
    python manage.py migrate your_app
    python manage.py sqlmigrate your_app 0001
    

    然后再次进入 sqlite,如下所示,并粘贴从 sqlimigrate 获得的所有代码:

    sqlite3 db.sqlite3
    

    作为示例,这是我粘贴在 sqlite 中的内容:

    CREATE TABLE "adpet_ad" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(200) NOT NULL, "breed" varchar(30) NULL, "weight" decimal NULL, "age" integer NULL, "text" text NOT NULL, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL, "picture" BLOB NULL, "content_type" varchar(256) NULL, "name" varchar(100) NULL, "phone" varchar(31) NOT NULL, "gender_id" integer NULL REFERENCES "adpet_gender" ("id") DEFERRABLE INITIALLY DEFERRED, "owner_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED, "size_id" integer NULL REFERENCES "adpet_size" ("id") DEFERRABLE INITIALLY DEFERRED, "specie_id" integer NULL REFERENCES "adpet_specie" ("id") DEFERRABLE INITIALLY DEFERRED, "sterilized_id" integer NULL REFERENCES "adpet_sterilized" ("id") DEFERRABLE INITIALLY DEFERRED, "vaccinated_id" integer NULL REFERENCES "adpet_vaccinated" ("id") DEFERRABLE INITIALLY DEFERRED);
    
  • 删除 django 应用程序迁移文件夹中的所有迁移,然后运行 ​​makemigrations,然后运行迁移命令。你应该能够摆脱困境。

  • Jed 2月前 0 只看Ta
    引用 9

    我认为您跳过了这些步骤...运行以下命令来查看是否忘记执行它们...它对我有用。

    $ python manage.py makemigrations

    $ python manage.py 迁移

    谢谢。

  • 我只是犯了一个粗心的错误,在迁移后忘记实际应用迁移(迁移)。写下这些只是为了以防有人犯同样的错误。

  • 任何来这里的人:

    删除所有迁移删除 db.sqlite 文件

    重做迁移

  • 请正确格式化代码,点击此处了解如何操作。另外,不要将您的答案链接到其他人的答案,因为它可能会被删除,当您拥有足够的 [声誉](.com/help/whats-reputation) 时,您可以留下 [评论](.com/help/privileges/comment)。

  • 引用 13

    如果按照@Burhan Khalid 所说的操作后错误仍然存​​在

    尝试以下行:python manage.py migration --run-syncdb

  • eqzx 2月前 0 只看Ta
    引用 14

    在我的例子中, admin.py 我查询的是添加了新字段的表 ForeignKey 。因此注释掉它 admin.py ,然后照常运行 makemigrations 和迁移命令。最后取消注释 admin.py .

  • 引用 15

    迁移文件夹中隐藏 有一个 pycache pycache 文件夹。

    您唯一不应该删除的是您的 init 文件。

    希望这有帮助

  • Dwza 2月前 0 只看Ta
    引用 16

    我最近遇到了这个问题,尽管是在不同的教程中。我有 django 版本 2.2.3,所以我认为我不应该遇到这种问题。就我而言,一旦我向模型添加新字段并尝试在中访问它 admin ,它会说 no such column 。经过三天无果而终的寻找解决方案后,我学会了“正确”的方法。首先,如果您要更改模型,则应确保服务器没有运行。这就是导致我自己的问题的原因。而且这并不容易纠正。我不得不重命名该字段(在服务器未运行时)并重新应用迁移。其次,我发现 python manage.py makemigrations <app_name> 捕获了更改而不仅仅是 python manage.py makemigrations 。我不知道为什么。您也可以跟进 python manage.py migrate <app_name> 。我很高兴我自己发现了这一点。

  • 如果您的问题与我的相似,那么这是一个解决方法。好消息是您不必删除您的数据库。

    检查没有其他模型使用该模型作为参考。

    django.db.utils.OperationalError: no such column: parts_part_type.blah
    

    这只发生在我身上,因为我在一个名为“products\”的另一个应用程序中有另一个名为“product\”的模型,该模型引用了该模型。

    part = models.ForeignKey("parts.Part", related_name="some part", limit_choices_to={'part_type':Part_Type.objects.get(prefix='PART')},)
    

    我的解决方案是:

    1. 中注释掉其他应用程序(在本例中为 prodcuts) settings.py
    2. python manage.py makemigrations; python manage.py migrate
    3. 取消注释其他应用程序以便再次启用它。
    4. python manage.py makemigrations; python manage.py migrate

    从技术上讲,我认为我需要更改 limit_choices_to 参考,以便

  • 这可能是最烦人且最耗时的问题之一,回溯对于解决问题没有帮助。

    这意味着你的数据库乱了,你必须删除数据库才能重新启动。

    值得一提的是,重构了一些现有的字段:

    • 当我们尝试连接模型时,基本上有两种方法:

    第一个

    from comments.models import Comment
    
    class Article(models.Model):
        comments = models.ManyToManyField(Comment)
    

    第二个

    class Article(models.Model):
        comments = models.ManyToManyField('comments.Comment')
    

    第一种方法被初学者广泛使用,它可能会导致 循环导入问题 ,当你尝试导入时 A.py B.py B.py 也会导入 A.py .

    因此,我们必须放弃第一种方法,并全部实施第二种方法。这是解决问题的方法,不幸的是您需要删除数据库。

    • 删除 db.sqlite3
    • 对于所有应用程序,打开 migration 文件夹,删除除 __init__.py
    • python manage.py makemigrations
    • python manage.py migrate

    一旦问题解决,如果你遵循惯例,这个问题就不会再发生:

    • 无论您身在何处, 都不要导入模型
    from django.apps import apps
    apps.get_model(app_name, model_name)
    # Article = apps.get_model('articles', 'Article')
    

    在字段中它可以被简报给字符串, <app_name>_<model_name>

    class Article(models.Model):
        comments = models.ManyToManyField('comments.Comment')
    

    下面是一个删除所有迁移的脚本,创建一个 clean.py 同级别的 manage.py

    import os
    
    
    def recursor(dirpath):
        # print(dirpath)
        delfiles = []
        deldirs = []
        with os.scandir(dirpath) as l1:
            for e1 in l1:
                if not e1.is_file():
                    with os.scandir(e1.path) as l2:
                        for e2 in l2:
                            if e2.name == 'migrations':
                                with os.scandir(e2.path) as l3:
                                    for e3 in l3:
                                        if not e3.name == '__init__.py':
                                            print(e3.path)
                                            if e3.is_file():
                                                delfiles.append(e3.path)
                                            else:
                                                deldirs.append(e3.path)
                                                with os.scandir(e3.path) as l4:
                                                    for e4 in l4:
                                                        delfiles.append(e4)
        yn = input('are you sure to delete all the files above?(y/n)')
        if yn == 'y':
            for dp in delfiles:
                os.remove(dp)
            for dp in deldirs:
                os.rmdir(dp)
    
    
    
    recursor(os.path.dirname(os.path.realpath(__file__)))
    
  • 您没有迁移在模型中所做的所有更改。因此 1) python manage.py makemigrations 2) python manage.py migrate 3) python manag.py runserver 它 100% 有效

  • 同意 Rishikesh 的观点。我也尝试解决这个问题很长时间了。这个问题可以通过以下两种方法之一或两种方法解决:

    1.尝试删除应用程序迁移文件夹中的迁移( init .py 除外),然后运行 ​​makemigrations 命令

    2.如果这不起作用,请尝试重命名模型(这是最后的手段,可能会有点混乱,但肯定会起作用。如果 django 询问“您是否重命名了模型?只需按 N。\”)。希望有帮助..:)

返回
作者最近主题: