2013-03-13 83 views
2

我有一個django 1.5項目在Apache服務器上使用運行mysql的django模型。django模型的遠程訪問

class Person(models.Model): 
    first_name = models.CharField(max_length=100) 
    last_name = models.CharField(max_length=100) 
    birthdate = models.DateField() 

class Book(models.Model): 
    name = models.CharField(max_length=100) 
    author = models.ForeignKey(Person) 

我也有必須使用這些模型在遠程計算機上運行一個python/Django應用程序(使用Django自定義命令)。

  • 遠程應用程序共享與服務器相同的模型定義
  • 遠程應用需求只讀到模型訪問
  • 遠程應用程序不能有服務器數據庫的完全轉儲,因爲服務器必須根據用戶權限返回的查詢集
  • 遠程應用程序只能HTTP連接到服務器
  • 服務器會暴露在REST API模型(JSON)

有沒有自動化的方式通過http傳輸模型?我曾嘗試使用django.core.serializers但我有以下問題:

  • 我不能序列在查詢集相關對象
  • 遠程應用離不開本地數據庫
  • 遠程應用程序搜索相關對象的工作在反序列化後的本地數據庫(即不存在)

編輯:

我設法序列化模式是這樣的:

books = Book.objects.prefetch_related('author').all() 
authors = [book.author for book in books] 
data = authors + list(books.all()) 
serialized_data = django.core.serializers.serialize("json", data) 

我的問題是,遠程應用程序無法反序列化沒有本地數據庫。

+0

爲什麼你需要沒有數據庫的模型?這沒有任何意義。只需創建REST API,以便服務器將對遠程應用程序進行查詢。爲什麼你不能將文件複製到遠程應用程序?曾聽說過倉庫? – freakish 2013-03-13 15:42:15

+0

遠程計算機是否知道模型的結構?如果是這樣,你可以序列化模型中的*字段等,並通過它們。 – danodonovan 2013-03-13 15:42:57

+0

遠程應用程序知道模型結構 – nkout 2013-03-13 15:54:38

回答

0

不要以爲你需要通過http傳輸模型。 只需要連接到服務器數據庫。 在遠程應用程序設置中,選擇數據庫引擎(在你的情況下,MySQL),名稱。 指定適當的用戶和密碼。 然後輸入一個有效的主機和代理(如果需要)。數據庫服務器運行的那個

至於用戶。在服務器上創建一個只讀數據庫的mysql用戶。

這將使您能夠爲服務器和遠程應用程序使用相同的數據庫。

+0

應用程序對服務器的唯一訪問權限(由於策略問題)超過了http。實際上,我想爲服務器上的模型設置值,並且遠程應用程序應該能夠讀取它們(並非全部,但是已過濾),並根據模型值執行某些操作。我需要一個類似於http代理的模型 – nkout 2013-03-13 15:57:20

+0

允許我將您重定向到REST API庫。在Django項目的情況下,我可以推薦你這個:http://django-rest-framework.org/ 還有幾個其他的庫,但我只有我提到的那個經驗,我喜歡它。 – gagamil 2013-03-13 16:19:31

0

最後,我通過客戶端

使用SQLite運行在RAM上settings.py解決我用這個配置

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

和代碼是這樣的:

from django.db import connections 
from django.core.management.color import no_style 
from django.core import serializers 
from apps.my_models import Book, Person 

connection = connections['default'] 
cursor = connection.cursor() 

sql, references = connection.creation.sql_create_model(Book, no_style(), set()) 
cursor.execute(sql[0]) 
sql, references = connection.creation.sql_create_model(Person, no_style(), set()) 
cursor.execute(sql[0]) 

serialized_data = get_serialized_data() 
for obj in serializers.deserialize("json", serialized_data): 
    obj.save() 
books = Book.objects.prefetch_related('author').all() 
+0

這是如何連接到遠程服務器的? – jaynp 2014-11-05 23:51:04