2015-10-16 16 views
9

Tôi đã sử dụng Django ORM cho một trong các ứng dụng web của mình và tôi rất thoải mái với nó. Bây giờ tôi đã có một yêu cầu mới mà cần cơ sở dữ liệu nhưng không có gì khác mà Django cung cấp. Tôi không muốn đầu tư thêm thời gian để học thêm một ORM như sqlalchemy.Làm thế nào để sử dụng Django 1.8.5 ORM mà không cần tạo một dự án django?

Tôi nghĩ mình vẫn có thể làm
from django.db import models
và tạo mô hình, nhưng sau đó không manage.py thế nào tôi sẽ làm di cư và đồng bộ?

+2

Bản sao có thể có của [Sử dụng Django ORM dưới dạng độc lập] (http://stackoverflow.com/questions/937742/use-django-orm-as-standalone) – user1797792

+2

Đồng ý, Câu hỏi trùng lặp với "use-django-orm-as - "độc lập" và "Chỉ sử dụng một số phần của Django?"và" sử dụng-chỉ-the-db-part-of-django "nhưng câu trả lời dành cho các phiên bản cũ của django, nếu tôi đóng câu hỏi này, Sẽ mất nhiều thời gian để ai đó viết câu trả lời cho phiên bản mới nhất và đưa nó đến câu trả lời đầu hoặc câu trả lời thứ nhất –

+0

Bản sao có thể có của [Sử dụng django cho công cụ CLI] (http://stackoverflow.com/questions/32088702/using-django-for-cli-tool) – e4c5

Trả lời

18

Có rất nhiều câu trả lời ở đó hoạt động với phiên bản cũ của Django, nhưng Django liên tục cập nhật và trong nghiên cứu của tôi, tôi không tìm thấy câu trả lời khả thi cho Django 1.8/1.9, vì vậy tôi phải tự cuộn. Đây là cách bạn làm điều đó: Cơ cấu

dự án:

├── data 
│   ├── __init__.py 
│   ├── migrations 
│   │   └── __init__.py 
│   └── models.py 
├── main.py 
├── manage.py 
└── settings.py 

Các data thư mục và di chuyển thư mục chứa trống __init__.py tập tin. Tệp mẫu models.py đọc như sau:

from django.db import models 

class User(models.Model): 
    name = models.CharField(max_length=255) 
    email = models.EmailField(max_length=255) 

file manage.py là điển hình Django manage.py tập tin. Chỉ cần chắc chắn để thay đổi các thiết lập param trong os.environ.setdefault nếu bạn sao chép nó từ một lệnh tươi django-admin startproject:

#!/usr/bin/env python 
import os 
import sys 

if __name__ == "__main__": 
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings") 
    from django.core.management import execute_from_command_line 
    execute_from_command_line(sys.argv) 

File settings.py đòi hỏi 3 thiết lập: CƠ SỞ DỮ LIỆU, INSTALLED_APPS, và SECRET_KEY. Tham khảo tài liệu Django cho DBS mà không phải là SQLite:

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.sqlite3', 
     'NAME': 'sqlite.db', 
    } 
} 

INSTALLED_APPS = (
    'data', 
    ) 

SECRET_KEY = 'REPLACE_ME' 

Bí quyết thực sự là trong main.py, đó sẽ là nơi bạn có thể mã hóa chống lại mô hình của bạn. Rõ ràng bạn phải sử dụng wsgi để có được những điều làm việc với hai dòng sau:

from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 

Dưới đây là một main.py mẫu:

# Django specific settings 
import os 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings") 

### Have to do this for it to work in 1.9.x! 
from django.core.wsgi import get_wsgi_application 
application = get_wsgi_application() 
############# 

# Your application specific imports 
from data.models import * 

#Add user 
user = User(name="someone", email="[email protected]") 
user.save() 

# Application logic 
first_user = User.objects.all()[0] 

print(first_user.name) 
print(first_user.email) 

This project cùng với this post là điểm khởi đầu hữu ích cho tôi để tìm câu trả lời , và yêu cầu kéo của tôi với mã làm việc cho Django 1.9 đã được sáp nhập, vì vậy bạn có thể lấy mã từ repo masnun của bây giờ. Nếu bạn biết cách tốt hơn, vui lòng gửi yêu cầu kéo.

+1

Câu trả lời này hoàn toàn phù hợp với django- gần đây Phiên bản !! Cảm ơn :) – user3595632

+0

hoạt động như một sự quyến rũ! – Chriz

+1

là điều này vẫn còn liên quan cho 1.10.1? – waspinator

1

Django 1.11 documentation on how the applications are loaded

Đối với cấu trúc phiên bản dự án django mới nhất sẽ be-

|--myproject 
|--main.py 
|--manage.py 
|--myapp 
| |--models.py 
| |--views.py 
| |--admin.py 
| |--apps.py 
| |--__init__.py 
| |--migrations 
|--myproject 
| |--settings.py 
| |--urls.py 
| |--wsgi.py 
| |--__init__.py 

Bạn vẫn sẽ cần manage.py để chạy di cư, main.py là kịch bản độc lập của bạn

# main.py 
import os 
import django 
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings' 
django.setup() 
from myapp.models import MyModel 
print(MyModel.objects.all()[0]) 
5
import os 
from django.conf import settings 
from django.apps import apps 

conf = { 
    'INSTALLED_APPS': [ 
     'Demo' 
    ], 
    'DATABASES': { 
     'default': { 
      'ENGINE': 'django.db.backends.sqlite3', 
      'NAME': os.path.join('.', 'db.sqlite3'), 
     } 
    } 
} 

settings.configure(**conf) 
apps.populate(settings.INSTALLED_APPS) 

Kiểm tra trên django 1.11.x

+1

Cuối cùng điều này đã làm việc! Hầu hết các câu trả lời không hoạt động và tôi đã nhận được 'django.core.exceptions.AppRegistryNotReady: Ứng dụng chưa được tải.' –

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