ti-enxame.com

Alternativa ao setup_environ () preterido para scripts únicos do Django?

Eu usei setup_environ() um tempo atrás para escrever um script python único para ser executado a partir da linha de comando que realmente não se encaixava muito bem como um comando manage.py personalizado (minha escolha preferida). Ele configurou tudo bem. Eu suponho que nós estamos depreciando esta função porque os pythonistas que não são do Django fazem piada dos djangonautas por coisas mágicas como essa e nos cansamos de nos sentirmos sujos. Então, se é depreciado, qual é a alternativa? Talvez esta seja uma pergunta preguiçosa, mas o que eu preciso para executar no lugar de setup_environ para conseguir o mesmo efeito? Eu acho que eu poderia copiar/colar a função em meu script, mas estou assumindo que não era o ponto de depreciar isso. (obviamente eu ainda posso usar uma função obsoleta, mas quero que meu script sobreviva a algumas versões do Django)

46
Ben Roberts

Isso mudou em Django 1.7

import os
import Django
from myapp import models

os.environ.setdefault("Django_SETTINGS_MODULE", "myapp.settings")
Django.setup()

print models.MyModel.objects.get(pk=1)
58
Ben Davis

Para expandir a resposta do miki725, se antes você tivesse

from Django.core.management import setup_environ

import fooproject.settings as settings
setup_environ(settings)

basta substituir por

import os

os.environ.setdefault("Django_SETTINGS_MODULE", "fooproject.settings")
from Django.conf import settings

e suas configurações serão carregadas como configurações.

Para o Django 1.7+, veja a solução de Ben Davis.

28
Mark Chackerian

As notas de lançamento do Django 1.4 recomendam oficialmente o uso de Django.conf.settings.configure() para definir as configurações. Isso é bom para pequenos scripts para os quais você precisa fazer tudo do jeito "Pythonico". Se, no entanto, você tiver um projeto maior, gostaria de usar a abordagem do Django, que é ter um módulo/pacote de configurações separado e, em seguida, seu caminho na variável de ambiente Django_SETTINGS_MODULE. Esta é a abordagem que é usada em manage.py:

# manage.py

# ...
os.environ.setdefault("Django_SETTINGS_MODULE", "fooproject.settings")
# ...

Lançamento de documentos podem ser encontrados aqui .

21
miki725

Para adicionar ao que Leandro N disse (obrigado, Leandro!), Você tem que adicionar o Django.setup ().

Por exemplo, meu código:

import os, Django
os.environ.setdefault('Django_SETTINGS_MODULE', 'myproject.settings')
Django.setup()
from app.models import ModelA, ModelB

FYI, estou no Django 1.10.

2
jsamsf

Disclaimer: Estou usando o Django 1.8

Apenas adicionando meus 2 centavos: eu tentei algumas das soluções apresentadas nesta página, mas elas não funcionaram. Acabei de apresentar uma solução que compartilho abaixo.

Verifique se você está na pasta raiz do seu projeto. O mesmo onde manage.py está localizado.

#make sure basic imports are in place
>>> import os,Django

#set the specific Django settings file
>>> os.environ.setdefault("Django_SETTINGS_MODULE", "main.settings.base")

# import your modules and use them just like you do in your
# web apps
>>> from apps.customers import models as c

# normal usage... for instance:
>>> dir(c)
['You', 'Will', 'See', 'Your', 'Models', ... ]
1
Leandro N

Eu estou usando o Django 2.0 e Ben Davis está perto, mas eu não consegui fazê-lo funcionar. O que parece ter funcionado para mim é

import os
import sys
import Django

sys.path.append("/path/to/Django/project") #only required if project not already in path
os.environ.setdefault('Django_SETTINGS_MODULE','myapp.settings')

Django.setup() #run Django.setup BEFORE importing modules to setup the environ
from myapp.models import Thingy

t=Thingly.objects.all()

print(t)
0
Zexelon