2011-11-08 29 views
46

Tôi đang viết một tập lệnh để nhập một số đối tượng mô hình vào cơ sở dữ liệu mà ứng dụng django của tôi sử dụng. Trong quá khứ tôi đã giải quyết điều này bằng cách chạy ./manage.py shell và sau đó import myscript. Tôi chắc chắn có một cách tốt hơn. Tôi muốn có thể gọi một tập lệnh từ bất kỳ nơi nào trên HD bằng cách sử dụng python scriptname.py và trong một vài dòng đầu tiên của tập lệnh đó, nó sẽ thực hiện bất kỳ thao tác nhập/hoạt động nào cần thiết để nó có thể truy cập các đối tượng mô hình và hoạt động như thể chạy bằng cách sử dụng manage.py shell.Kịch bản Django để truy cập các đối tượng mô hình mà không cần sử dụng manage.py shell

Tôi cần thêm gì vào kịch bản của mình để đạt được điều này?

EDIT:

Dựa trên @ câu trả lời Melug, với việc bổ sung các động thiết lập đường Python để giải quyết 'bất cứ nơi nào trên HD của tôi' là một phần của câu hỏi:

import sys 
sys.path.append('c:\\my_projec_src_folder') 
from myproject import settings 
from django.core.management import setup_environ 
setup_environ(settings) 

Trả lời

22

Bạn cần phải thiết lập môi trường django đầu tiên:

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

Lần cuối nhập mô hình của bạn, mọi thứ diễn ra như django.

+18

'setup_environ (settings)' không được dùng nữa kể từ Django 1.4! Bài đăng của tôi dưới đây cho thấy một thay thế bao gồm một ví dụ. – Michael

27

Tôi nghĩ cách tốt nhất là tạo custom management command(s) của bạn. Sau đó, bạn có thể gọi manage.py <yourcommand> từ bất kỳ đâu.

+4

Tùy chọn tốt hơn về lâu dài. –

+0

Tôi đồng ý, đây là con đường để đi. Nó không khó hơn nhiều so với việc tạo ra một kịch bản độc lập và mạnh mẽ hơn nhiều. –

+1

Mặc dù đúng, đôi khi nó vẫn được yêu cầu sử dụng các mô hình django từ các tập lệnh khác. – Rebs

100

Vì Django 1.4, bạn nên tránh sử dụng setup_environ(settings) (bài đăng của Melug) vì không được dùng nữa. Sử dụng sau đây thay vào đó và bạn sẽ có thể truy cập vào mô hình của bạn

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.. 

Dưới đây là một ví dụ để truy cập và sửa đổi mô hình của bạn:

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

mô hình Ví dụ:

class Location(models.Model): 
    name = models.CharField(max_length=100) 
+1

đây thực sự là cách nó được thực hiện ngay bây giờ và hoạt động hoàn hảo. –

+3

Điều này làm việc cho tôi chỉ sau khi tôi chuyển os.environ.setdefault ("DJANGO_SETTINGS_MODULE", "your_project_name.settings") sang dòng ngay sau khi nhập os. Nếu không, đây là một giải pháp tốt hơn nhiều. –

+0

Điểm tốt, Peter! Có lẽ một số nhập khẩu mô hình chỉ hoạt động sau dòng 'os.environ.setdefault (...)'. Tôi sắp xếp lại các hàng nhập khẩu trong bài viết của tôi, bây giờ nó sẽ làm việc cho tất cả mọi người. PS: Nếu bạn thích giải pháp này tốt hơn, hãy bỏ phiếu cho nó. Cảm ơn! – Michael

64

Để có được các mô hình được tải quá, tôi phải kết hợp điều này với this answer, nếu không tôi sẽ nhận được django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet

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

Là một phụ, tôi thêm video này vào các __init__.py các dự án django của tôi, nó sẽ tự động dò tìm tên ứng dụng để nó là copy/paste-thể:

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

Sau đó, tôi chỉ có thể làm:

from <app> import setup 
setup() 
+4

Cảm ơn, rõ ràng là cần thiết để gọi thiết lập() kể từ ** Django 1.7 **. – Phae7rae

+1

Việc thiết lập() trong init là tốt đẹp, thích nó! – ulath

+0

Đây sẽ là câu trả lời chính xác ngay bây giờ. Chỉ có giải pháp phù hợp với tôi. – theeastcoastwest

2

Dưới đây là câu trả lời cho các phiên bản 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) 
4

cho Django 1,11

giải pháp Upper đã không làm việc, nhưng đã cho tôi một lỗi:

django.core.exceptions.AppRegistryNotReady: Apps không được nạp được nêu ra.

Đối với tôi giải pháp từ here làm việc ra:

import os 
from django.core.wsgi import get_wsgi_application 

os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings' 
application = get_wsgi_application() 
13

Đối với Django phiên bản 1.9 hoặc mới hơn, bạn có thể sử dụng này:

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 

vì vậy bạn có thể sử dụng đối tượng như đối tượng django cùng:

from myapp.models. import Locations 
all_locations = Locations.object.all() 
first_location = Locations.object.get(id=1) 
print first_location.name() 
first_location.save() 
1

Vì ít nhất Django 1.11, ứng dụng chính của bạn bao gồm một wsgi m odule mà thiết lập cần thiết về nhập khẩu. Giả sử myproject/myproject là nơi settings.py của bạn, trong kịch bản của bạn chỉ cần nhập khẩu:

from myproject.wsgi import application 
0

Nếu bạn nhận được:

django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet. 

Hãy thử:

import os 
from django.core.wsgi import get_wsgi_application 

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings') 
application = get_wsgi_application() 
0

Hãy thử:

os.environ["DJANGO_SETTINGS_MODULE"] = "mysite.settings"

nếu os.environ.setdefault không hoạt động. (Windows 10, python3.6.4, django 2.0.3)

Các vấn đề liên quan