2

我有一个 django 1.5 项目,在 apache 服务器上运行的 mysql 上使用 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)

我的问题是远程应用程序在没有本地数据库的情况下无法反序列化。

4

2 回答 2

0

不要认为您需要通过 http 传输模型。只需要连接到服务器数据库。在远程应用程序设置中选择数据库引擎(在您的情况下为 mysql),名称。指定适当的用户和密码。并输入有效的主机和代理(如果需要)。您的数据库服务器正在运行的那个

至于用户。在服务器上创建一个对数据库具有只读权限的 mysql 用户。

这将使您能够为服务器和远程应用程序使用相同的数据库。

于 2013-03-13T15:46:31.657 回答
0

最后我通过在客户端使用在 ram 上运行的 sqlite 解决了

在 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()
于 2013-03-14T11:34:07.823 回答