type queryset query example python django django-models

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)



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