2013-03-13 63 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