Kesalahan Pengaturan Django DB 'Tidak Dikonfigurasi'

170

Django (1.5) baik-baik saja bagi saya, tetapi ketika saya menjalankan interpreter Python (Python 3) untuk memeriksa beberapa hal, saya mendapatkan kesalahan paling aneh ketika saya mencoba mengimpor - from django.contrib.auth.models import User-

Traceback (most recent call last):
  File "/usr/local/lib/python3.2/dist-packages/django/conf/__init__.py", line 36, in _setup
    settings_module = os.environ[ENVIRONMENT_VARIABLE]
  File "/usr/lib/python3.2/os.py", line 450, in __getitem__
    value = self._data[self.encodekey(key)]
KeyError: b'DJANGO_SETTINGS_MODULE'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.2/dist-packages/django/contrib/auth/models.py", line 8, in <module>
    from django.db import models
  File "/usr/local/lib/python3.2/dist-packages/django/db/__init__.py", line 11, in <module>
    if settings.DATABASES and DEFAULT_DB_ALIAS not in settings.DATABASES:
  File "/usr/local/lib/python3.2/dist-packages/django/conf/__init__.py", line 52, in __getattr__
    self._setup(name)
  File "/usr/local/lib/python3.2/dist-packages/django/conf/__init__.py", line 45, in _setup
    % (desc, ENVIRONMENT_VARIABLE))

django.core.exceptions.ImproperlyConfigured: Requested setting DATABASES, 
  but settings are not configured. You must either define the environment 
  variable DJANGO_SETTINGS_MODULE or call settings.configure() 
  before accessing settings.

Bagaimana itu bisa dikonfigurasi dengan tidak benar, ketika berfungsi dengan baik di luar interpreter Python? Dalam pengaturan Django saya, DATABASESpengaturannya adalah:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'django_db', # Or path to database file if using sqlite3.
        # The following settings are not used with sqlite3:
        'USER': 'zamphatta',
        'PASSWORD': 'mypassword91',
        'HOST': '', # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
        'PORT': '', # Set to empty string for default.
    }
}

... bagaimana ini tidak terkonfigurasi dengan benar?

Zamphatta
sumber
Datangi ini ketika menyiapkan proyek baru. Saya merasa terbantu melakukannya unset DJANGO_SETTINGS_MODULE. Saya mengalami masalah di mana saya telah mengatur env var di .bashrc
fncomp

Jawaban:

264

Anda tidak bisa menjalankan Python dan memeriksa berbagai hal, Django tidak tahu proyek apa yang ingin Anda kerjakan. Anda harus melakukan salah satu dari ini:

  • Menggunakan python manage.py shell
  • Gunakan django-admin.py shell --settings=mysite.settings(atau modul pengaturan apa pun yang Anda gunakan)
  • Setel DJANGO_SETTINGS_MODULEvariabel lingkungan di OS Anda kemysite.settings
  • (Ini dihapus dalam Django 1.6) Gunakan setup_environdalam juru bahasa python:

    from django.core.management import setup_environ
    from mysite import settings
    
    setup_environ(settings)

Secara alami, cara pertama adalah yang termudah.

Pavel Anossov
sumber
Terima kasih! Itu tidak cukup jelas bagi saya dalam dokumentasi, atau mungkin saya membacanya & lupa pada saat saya perlu melakukannya.
Zamphatta
6
Anehnya sepertinya tidak dapat menemukan file 'mysite.settings', tetapi saya dapat melihatnya duduk di sana sebagai mysite / settings.py. Ugh! Saya mulai membenci Django.
Zamphatta
3
Ya, setup_environdihapus di 1.6, tetapi --settingsharus berfungsi. Apakah Anda yakin pengaturan Anda lebih lanjut FirstBlog.settings, dan tidak hanya di settingsdalam direktori saat ini?
Pavel Anossov
21
Tidak ada yang di atas bekerja untuk saya, tetapi yang ini berhasil:$ export DJANGO_SETTINGS_MODULE="my_project.settings"
Thumbz
22
Di PyCharm tempat untuk melakukan ini adalah Jalankan | Edit Konfigurasi | (mis. Unittests dalam proyek) | Konfigurasi | Lingkungan | Variabel lingkungan: DJANGO_SETTINGS_MODULE=(project directory name).settings
Bob Stein
41

Di shell python Anda / ipython lakukan:

from django.conf import settings

settings.configure()
Montaro
sumber
11
Apps aren't loaded yet.
Daniil Mashkin
26

Pada 2017 dengan django 1.11.5 dan python 3.6 ( dari komentar ini juga berfungsi dengan Python 2.7 ):

import django
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
django.setup()

Di .pymana Anda meletakkan kode ini harus berada dalam mysite(orang tua)

MagTun
sumber
Terima kasih banyak, tidak ada solusi lain yang berhasil dalam kasus saya
evnica
Bekerja dengan python 2.7 juga
Александр
Ini .pyharus ditempatkan di root , yang berarti itu bersama dengan manage.py. Bagaimana cara menempatkannya di dalam folder acak?
Anonim
1
Perlu dicatat bahwa ini hanya akan berfungsi jika Anda meletakkannya di bagian atas file Anda, jika Anda memasukkannya ke dalam sesuatu seperti if __name__ == "__main__":itu tidak akan berfungsi dengan benar :)
Josh Correia
11

Pada Django 1.9, saya mencoba django-admin runserverdan mendapatkan kesalahan yang sama, tetapi ketika saya menggunakan, python manage.py runserversaya mendapatkan hasil yang diinginkan. Ini dapat mengatasi kesalahan ini untuk banyak orang!

Jacob Young
sumber
sama, pada Django 1.10, tetapi ketika mencoba menjalankan perintah loaddata
amchugh89
4

Dalam kasus saya, saya mendapatkan ini ketika mencoba menjalankan tes Django melalui PyCharm. Saya pikir itu karena PyCharm tidak memuat pengaturan proyek Django awal, yaitu yang manage.py shellberjalan pada awalnya. Satu dapat menambahkannya ke awal skrip pengujian atau hanya menjalankan tes menggunakan manage.py test.

Versi:

  • Python 3.5 (dalam virtualenv)
  • PyCharm 2016.3.2 Profesional
  • Django 1.10
Hapus
sumber
3

dalam kasus saya sendiri di Django 1.10.1 berjalan pada python2.7.11, saya mencoba untuk memulai menggunakan server django-admin runserveralih-alih manage.py runserverdalam direktori proyek saya.

Dev
sumber
0

Untuk orang yang menggunakan IntelliJ, dengan pengaturan ini saya bisa melakukan query dari shell (di windows).

masukkan deskripsi gambar di sini

Stef Van Looveren
sumber