queryset - models py python
Script de Django para acceder a los objetos del modelo sin usar el shell manage.py (10)
Estoy escribiendo un script para importar algunos objetos de modelo en la base de datos que usa mi aplicación django. En el pasado, he resuelto esto ejecutando el ./manage.py shell
y luego import myscript
. Estoy seguro de que hay una mejor manera. Me gustaría poder invocar un script desde cualquier parte de mi HD usando python scriptname.py
, y en las primeras líneas de ese script haría las importaciones / otras operaciones necesarias para que pueda acceder a los objetos del modelo y comportarse como aunque se ejecutó usando el manage.py shell
¿Qué necesito agregar a mi script para lograr esto?
EDITAR:
Basado en la respuesta de @ Melug, con la adición de una ruta de Python configurada dinámicamente para abordar la parte de la pregunta ''en cualquier parte de mi HD'':
import sys
sys.path.append(''c://my_projec_src_folder'')
from myproject import settings
from django.core.management import setup_environ
setup_environ(settings)
Aquí está la respuesta para las versiones de Django> 1.4:
from django.core.management import settings
from myproject.myproject import settings as project_settings
if not settings.configured:
settings.configure(default_settings=project_settings)
Creo que la mejor manera es crear tu (s) comando (s) de administración personalizados . Luego puede llamar a manage.py <yourcommand>
desde cualquier lugar.
Desde al menos Django 1.11, su aplicación principal incluye un módulo wsgi que realiza la configuración necesaria en la importación. Asumiendo que myproject/myproject
es donde está tu settings.py, en tu script simplemente importa:
from myproject.wsgi import application
Para Django versión 1.9 o posterior, puede usar esto:
import sys
import os
import django
sys.path.append(''your_project_directory'')
os.environ[''DJANGO_SETTINGS_MODULE''] = ''your_project.settings''
django.setup()
from yourapp.models import your_model
para que pueda usar object como el mismo objeto django:
from myapp.models. import Locations
all_locations = Locations.object.all()
first_location = Locations.object.get(id=1)
print first_location.name()
first_location.save()
Para que los modelos también se carguen, tuve que combinar esto con esta respuesta , de lo contrario obtengo django.core.exceptions.AppRegistryNotReady: Models aren''t loaded yet
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
import django
django.setup()
Como extra, agrego esto al __init__.py
de mis proyectos django, automáticamente descubrirá el nombre de la aplicación para que pueda copiar / pegar:
import os
def setup():
module = os.path.split(os.path.dirname(__file__))[-1]
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{}.settings".format(module))
import django
django.setup()
Entonces puedo hacer:
from <app> import setup
setup()
Primero debe configurar el entorno django:
from your_project import settings
from django.core.management import setup_environ
setup_environ(settings)
Al final importa tus modelos, todo va como django.
Si lo consigues:
django.core.exceptions.AppRegistryNotReady: Models aren''t loaded yet.
Tratar:
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault(''DJANGO_SETTINGS_MODULE'', ''myapp.settings'')
application = get_wsgi_application()
Tratar:
os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"
si os.environ.setdefault
no funciona. (Windows 10, python3.6.4, django 2.0.3)
Desde Django 1.4 debes evitar el uso de setup_environ(settings)
(publicado por Melug) porque está en desuso. Use lo siguiente en su lugar y podrá acceder a su modelo
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings")
# your imports, e.g. Django models
from your_project_name.models import Location
# From now onwards start your script..
Aquí hay un ejemplo para acceder y modificar su modelo:
if __name__ == ''__main__'':
# e.g. add a new location
l = Location()
l.name = ''Berlin''
l.save()
# this is an example to access your model
locations = Location.objects.all()
print locations
# e.g. delete the location
berlin = Location.objects.filter(name=''Berlin'')
print berlin
berlin.delete()
Modelo de ejemplo:
class Location(models.Model):
name = models.CharField(max_length=100)
PARA DJANGO 1.11
Las soluciones superiores no funcionaron, pero me dieron un error:
django.core.exceptions.AppRegistryNotReady: las aplicaciones aún no están cargadas.
Para mí, la solución de here resultó:
import os
from django.core.wsgi import get_wsgi_application
os.environ[''DJANGO_SETTINGS_MODULE''] = ''myapp.settings''
application = get_wsgi_application()