【问题标题】:Migrate from Google App Engine Model to Pure Django System从 Google App Engine 模型迁移到纯 Django 系统
【发布时间】:2012-02-29 02:22:38
【问题描述】:

如何为纯 Django 模型系统重写此 AppEngine 特定代码 (没有谷歌 api)

class A(db.Model):
    name = db.StringProperty(multiline=True)
    description = db.TextProperty()
    isAdvanced = db.BooleanProperty()
    foos = db.ListProperty(db.Key)    
    bar = db.IntegerProperty()

    def get_foos(self):
        return db.get(self.foos)

【问题讨论】:

    标签: python django google-app-engine refactoring


    【解决方案1】:

    AFAIK,您必须手动完成。不过值得庆幸的是,Django 可以为您完成大部分工作。

    首先,确保您在settings.py 中具有适当的数据库设置。您可以找到详细的数据库配置演练here

    完成后,运行python manage.py inspectdb > models.py。它将manage.py 的输出(构建模型的python 代码)转储到models.py,然后您可以将其添加到相关的Django 应用程序中。您必须仔细检查它,但它应该花费更少的精力。

    另外,从个人经验来看,如果遇到任何问题,会通知您。例如,PostgreSQL 的 money 和 MySQL 的 currency 字段都不能被 Django 的模型识别,所以它会发出 models.TextField(),然后是 # This is a guess.

    编辑: 刚刚在谷歌搜索时发现了这篇文章: Migrating from Google App Engine to Django

    编辑 2: 我刚刚意识到我可能没有回答您的问题。这是(大致)它的样子,但我仍然建议你运行python manage.py inspectdb > models.py

    from django.db import models
    
    class A(models.Model):
        name = models.TextField()
        description = models.TextField()
        isAdvanced = models.BooleanField()
        foos = # Dunno, a quick Google search doesn't turn up the equivalent
        bar = models.IntegerField()
    

    要获得 namemultiline 属性,您可能需要查看来自 Google 群组的 this question 或自行 Google。

    【讨论】:

    • 对于 foos,它似乎是模型。ManyToManyField 你能确认一下吗?
    • @Christophe 我会调查一下,但根据我对 Google 的 AppEngine 文档的理解,它似乎更像是一个 models.ForeignKey/SQL 数据类型的列表。
    • 好的,谢谢。你知道模型是否有简单的数组(postgres 有这种类型)
    • @Christophe 经过进一步研究,Django 的原生 ORM 中没有与 AppEngine 的 db.ListProperty 等效的东西,如 dragonx 所说。 (我在 groups.google.com/group/django-users/browse_thread/thread/… 找到了一个 hack,但它强调它不是生产代码。)此外,Postgres 的 Array 类型不支持开箱即用;您必须通过子类化model.Field 并自己编写类来添加此字段功能。请参阅stackoverflow.com/questions/4400762/… 了解更多信息。
    • 非常感谢我的英语不太好,找不到你给我的所有东西。
    【解决方案2】:

    Edwin 的回答是一个好的开始。

    我一直在使用 django-nonrel,而不是基本的 django。

    django-nonrel 带有一个名为 djangotoolbox 的模块,它为 google ListProperty 提供了一个 ListField 包装器。普通的 django 没有等价物。

    【讨论】:

      【解决方案3】:

      据我所知,您必须手动重写所有与数据库相关的代码。我也有类似的情况。 :-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-16
        • 2012-03-04
        • 2010-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多