it-swarm.com.de

OperationalError, keine solche Spalte. Django

Ich bin sehr neu in Django und konnte das Tutorial auf djangoproject.com ohne Fehler beenden. Ich gehe jetzt durch das Django REST Framework-Tutorial, das unter http://www.Django-rest-framework.org/ .__ gefunden wurde. Ich bin fast fertig damit und habe nur noch Authentifizierung hinzugefügt. Jetzt bekomme ich:

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

Ich habe an verschiedenen Stellen im Web nach nicht nur stackoverflow nach der Lösung gesucht, es scheint allgemein so, als ob das Problem bei meiner Datenbank liegt und ich es dann löschen muss, um es dann neu zu machen, ich habe dies mehrmals gemacht, das Tutorial hat mich sogar Löschen Sie die Datenbank und erstellen Sie sie am Punkt . Hier ist mein 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)

Mein 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')

Mein 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

Und zum Schluss mein 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')),
)

Ich entschuldige mich, wenn ich ein paar unnötige Informationen gepostet habe. Vielen Dank im Voraus, Jungs.

Edit: DB Schema:

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);

Nach einigem Graben fand ich heraus, dass beim Löschen und Wiederherstellen der Datenbank (wie das Tutorial sagt), anstatt den Befehl makemigrations zu verwenden, nicht nur die Spalten NICHT hinzugefügt werden, sondern auch nicht, dass beim Ausführen des Befehls makemigrations ein Fehler aufgetreten ist es sagt mir:

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

Wenn ich den Abschnitt highlighted in models.py auskommentiere, wird die gleiche Nachricht oben für die Zeile owner veröffentlicht. Es möchte also einen Standard für highlighted und owner, aber ich bin mir nicht sicher, was ich damit verwenden soll. Sowie das Tutorial hilft mir auch nicht dabei.

31
TaylorAllred

Während Sie das Tutorial durchgearbeitet haben, müssen Sie den Abschnitt über Migration kennengelernt haben, da dies eine der wichtigsten Änderungen in Django 1.7 war

Vor Django 1.7 hat der Befehl syncdb niemals Änderungen vorgenommen, die die Chance hatten, Daten zu löschen, die sich derzeit in der Datenbank befinden. Dies bedeutet, dass wenn Sie syncdb für ein Modell erstellt und dann eine neue Zeile zum Modell hinzugefügt haben (effektiv eine neue Spalte), syncdb diese Änderung in der Datenbank nicht beeinflusst.

Entweder haben Sie die Tabelle von Hand fallen gelassen und dann syncdb erneut ausgeführt (um sie von Grund auf neu zu erstellen, wobei keine Daten verloren gingen), oder Sie haben die richtigen Anweisungen manuell in die Datenbank eingegeben, um nur diese Spalte hinzuzufügen.

Dann kam ein Projekt namens south, das Migrationen implementierte. Dies bedeutete, dass es eine Möglichkeit gab, Änderungen an der Datenbank vorwärts zu migrieren (rückgängig zu machen, rückgängig zu machen) und die Integrität der Daten zu erhalten.

In Django 1.7 wurde die Funktionalität von south direkt in Django integriert. Bei Migrationen ist der Prozess etwas anders.

  1. Nehmen Sie Änderungen an models.py vor (wie üblich).
  2. Erstellen Sie eine Migration. Dadurch wird Code generiert, der vom aktuellen Zustand zum nächsten Zustand Ihres Modells wechselt. Dies geschieht mit dem Befehl makemigrations. Dieser Befehl ist intelligent genug, um die Änderungen zu erkennen, und erstellt ein Skript, um diese Änderung in Ihrer Datenbank durchzuführen.
  3. Als Nächstes wenden Sie diese Migration mit migrate an. Dieser Befehl wendet alle Migrationen in der angegebenen Reihenfolge an.

Ihre normale syncdb ist jetzt ein zweistufiger Prozess, python manage.py makemigrations, gefolgt von python manage.py migrate.

Nun zu Ihrem spezifischen Problem:

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)

In diesem Modell haben Sie zwei Felder highlighted und code, die erforderlich sind (sie dürfen nicht null sein).

Wenn Sie diese Felder von Anfang an hinzugefügt hätten, würde es kein Problem geben, da die Tabelle keine vorhandenen Zeilen enthält.

Wenn die Tabelle jedoch bereits erstellt wurde und Sie ein Feld hinzufügen, das nicht null sein kann, müssen Sie einen Standardwert definieren, um vorhandene Zeilen anzugeben. Andernfalls akzeptiert die Datenbank Ihre Änderungen nicht, da die Datenintegritätsbeschränkungen dadurch verletzt werden.

Dies ist, worum der Befehl Sie auffordert. Sie können Django anweisen, während der Migration einen Standardwert anzuwenden, oder Sie können dem Modell selbst einen "leeren" Standardwert highlighted = models.TextField(default='') zuweisen.

37
Burhan Khalid

Konzentrieren wir uns auf den Fehler:

Ausnahmewert: keine solche Spalte: snippets_snippet.owner_id

Mal sehen, ob das stimmt ...

Sie können den Befehl manage.py verwenden, um auf Ihre db-Shell zuzugreifen (hierbei werden die Einstellungen von settings.py verwendet, sodass Sie die richtige Verbindung herstellen können).

manage.py dbshell

Sie können jetzt die Details Ihrer Tabelle anzeigen, indem Sie Folgendes eingeben:

.schema TABLE_NAME

Oder in deinem Fall:

.schema snippets_snippet

Weitere sqlite-Befehle finden Sie hier oder durch Ausgeben eines: 

.Hilfe

Beenden Sie schließlich Ihre Sitzung, indem Sie Folgendes eingeben:

.Verlassen

Dies bringt Sie nicht aus dem Wald, aber es hilft Ihnen zu wissen, an welchem ​​Ende des Problems Sie arbeiten müssen :)

Viel Glück!

7

Ich sehe, wir haben hier das gleiche Problem, ich habe den gleichen Fehler. Ich möchte dies für den zukünftigen Benutzer schreiben, der den gleichen Fehler erfahren wird .. Nach Änderungen an Ihrem Klassen-Snippet-Modell wie @ Burhan Khalid haben Sie gesagt, Sie müssen Tabellen migrieren:

python manage.py makemigrations snippets
python manage.py migrate

Und das sollte den Fehler beheben.

6
PetarP

Dieser Fehler kann auftreten, wenn Sie eine Klasse instanziieren, die auf dieser Tabelle basiert, beispielsweise in views.py. 

3
marw

Der direkteste Weg, diese Art von Problem zu lösen, ist der folgende 3-Schritte-Prozess:

  1. Löschen Sie alle migrationsbezogenen Dateien aus dem Migrationsordnerverzeichnis von App (diese beginnen im Wesentlichen mit 0000, 0001, 0002 usw.).

  2. Löschen/Umbenennen der vorhandenen Datenbankdatei mit dem Namen/- db.sqlite3 aus dem App-Verzeichnis.

  3. Führen Sie nun den folgenden Befehl aus: 

    python manage.py migrate

    Schließlich ausführen

    python manage.py createsuperuser 

    um die administrativen Aufgaben auszuführen (wenn Sie möchten).

2
hygull

Aus Burhan Khalids Antwort und seinem Kommentar zu Migrationen: Was für mich funktionierte, war, den Inhalt des Ordners "migrations" zusammen mit der Datenbank zu entfernen und anschließend manage.py migrate auszuführen. Das Entfernen der Datenbank reicht aufgrund der gespeicherten Informationen zur Tabellenstruktur im Migrationsordner nicht aus. 

0
user3540774

Ich hatte dieses Problem kürzlich, obwohl in einem anderen Tutorial. Ich hatte die Django Version 2.2.3, also dachte ich, ich sollte diese Art von Problem nicht haben. In meinem Fall, wenn ich einem Modell ein neues Feld hinzufüge und versuche, in admin darauf zuzugreifen, es würde sagen no such column. Ich habe den richtigen Weg gelernt, nachdem ich drei Tage lang nach einer Lösung gesucht hatte, bei der nichts funktionierte. Wenn Sie ein Modell ändern, sollten Sie zunächst sicherstellen, dass der Server nicht ausgeführt wird. Das hat mein eigenes Problem verursacht. Und das ist nicht leicht zu korrigieren. Ich musste das Feld umbenennen (während der Server nicht lief) und Migrationen erneut anwenden. Zweitens fand ich, dass python manage.py makemigrations <app_name> erfasst die Änderung im Gegensatz zu nur python manage.py makemigrations. Ich weiß nicht warum. Sie können das auch mit python manage.py migrate <app_name>. Ich bin froh, dass ich das selbst herausgefunden habe.

0
Joshua Owoyemi

Schritt 1: Löschen Sie die Datei db.sqlite3.

Schritt 2: $ python manage.py migrieren

Schritt 3: $ python manage.py makemigrations

Schritt 4: Erstellen Sie den Superuser mit $ python manage.py createduperuser

new db.sqlite3 wird automatisch generiert

0
user11567783

denken Sie daran, dass im Migrationsordner der Ordner pycache versteckt ist. Wenn Sie also Ihre Modelle ändern und alle Ihre Migrationsdateien löschen, MÜSSEN Sie auch den Ordner pycache löschen.

Das einzige, was Sie nicht löschen sollten, ist Ihre init Datei.

Hoffe das hilft

0

Sie haben alles richtig gemacht, ich habe das gleiche Problem durchgemacht ... Zuerst lösche ich Ihre Datenbank und Migrationen. Ich löste meinen Namen in meiner App in makemigrations:

python manage.py makemigrations appname
python manage.py migrate

Das wird definitiv funktionieren. 

0
Dev Jalla

Stimmen Sie Rishikesh zu. Ich habe auch lange versucht, dieses Problem zu lösen. Dies wird mit einer oder beiden Methoden gelöst.

1. Versuchen Sie, die Migrationen im Migrationsordner der App zu löschen (außer init . Py) und dann den Befehl makemigrations ausführen

2.Wenn das nicht funktioniert, versuchen Sie, das Modell umzubenennen (dies ist der letzte Ausweg und kann etwas unordentlich werden, wird aber auf jeden Fall funktionieren.) Wenn Django fragt, "haben Sie das Modell umbenannt? Drücken Sie einfach N." hilft .. :)

0
Priyank Kodesia

Ich bin mit diesem Problem konfrontiert und habe es so gelöst.

1) Löschen Sie alle Migrationsdatensätze aus dem Migrationsverzeichnis Ihrer App. Dies sind Dateien mit den Namen 0001_, 0002_, 0003_ usw. Achten Sie darauf, das. _init__.py Datei.

2) Löschen Sie die Datei db.sqlite3. Es wird später regeneriert.

Führen Sie nun die folgenden Befehle aus:

python manage.py makemigrations appname
python manage.py migrate

Vergewissern Sie sich, dass Sie nach Makemigrations den Namen Ihrer App schreiben. Sie müssen möglicherweise einen Superuser erstellen, um erneut auf Ihre Datenbank zugreifen zu können. Tun Sie dies wie folgt 

python manage.py createsuperuser
0
Mayank Khanna

Ich habe auch das gleiche Problem. 

Wenn Sie ein neues Feld hinzufügen, wird der Fehler angezeigt, da keine Spalte gefunden wurde.

Dann wenden Sie den make migration-Befehl und danach den migrate-Befehl an Dann immer noch derselbe Fehler .. EX ...

 path=models.FilePathField()

Fügen Sie einen Standardwert für das Feld hinzu

  path=models.FilePathField(default='')

und dann den Befehl anwenden 

  python manage.py makemigrations

  python manage.py migrate

Es kann dir helfen

0
Abhimanyu Gaurh

Wenn Ihr Problem wie meines ist, ist dies eine Problemumgehung ... Die gute Nachricht ist, dass Sie Ihre Datenbank nicht löschen müssen.

Stellen Sie sicher, dass es kein anderes Modell gibt, das dieses Modell als Referenz verwendet. 

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

Dies geschah nur, weil ich ein anderes Modell namens "product" in einer anderen App namens "products" hatte, das dieses Modell referenzierte. 

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

Meine Lösung war:

  1. kommentieren Sie die andere App (in diesem Fall Prodcuts) aus settings.py aus.
  2. python manage.py makemigrations; python manage.py migrate
  3. kommentieren Sie die andere App, damit sie wieder aktiviert wird.
  4. python manage.py makemigrations; python manage.py migrate

Technisch denke ich muss ich den limit_choices_to Verweis also ändern 

0
SpiRail

Anfangs habe ich meine neuen Felder kommentiert, die diese Fehler verursachen, und dann python manage.py makemigrations und dann python manage.py migrate ausführen, um diese neuen Felder tatsächlich zu löschen. 

class FootballScore(models.Model):
    team = models.ForeignKey(Team, related_name='teams_football', on_delete=models.CASCADE)
    # match_played = models.IntegerField(default='0')
    # lose = models.IntegerField(default='0')
    win = models.IntegerField(default='0')
    # points = models.IntegerField(default='0')

class FootballScore(models.Model):
    team = models.ForeignKey(Team, related_name='teams_football', on_delete=models.CASCADE)
    match_played = models.IntegerField(default='0')
    lose = models.IntegerField(default='0')
    win = models.IntegerField(default='0')
    points = models.IntegerField(default='0')

Dann habe ich sie unkommentiert und python manage.py makemigrations und python manage.py migrate und boom ausführen. Es hat für mich funktioniert. :)

0
Aadil Hoda