zoukankan      html  css  js  c++  java
  • Django实战(11):修改Model类

    我们已经实现了卖方的产品维护界面,根据最初的需求,还要为买方实现一个目录页:买方通过这个界面浏览产品并可以加入购物车。通过进一步需求调研,了解到产品有一个“上架时间”,在这个时间之后的产品才能被买方看到。并且买方应该先看到最新的产品。

    我们注意到,这个“新需求”需要对Product进行调整,增加一个日期属性date_available来保存“上架时间”。如同开发新功能一样,在修改的时候也应该从model开始。

    为Model类增加一个属性很容易:

        class Product(models.Model):
        title = models.CharField(max_length=100,unique=True)
        description     = models.TextField()
        image_url = models.URLField(max_length=200)
        price = models.DecimalField(max_digits=8,decimal_places=2)
        date_available = models.DateField()

    问题在于,model类的改变需要对数据库表也进行同样的修改。你可能想到前面介绍过的python manage.py syncdb, 但是很遗憾这个命令现在不起作用了。因为syncdb仅仅创建数据库里还没有的表,它 并不 对你数据模型的修改进行同步,也不处理数据模型的删除。 如果你新增或修改数据模型里的字段,或是删除了一个数据模型,你需要手动在数据库里进行相应的修改。 当然,在开发环境你可以drop相应的表,然后运行syncdb重新创建。但是这样做对于发布环境没有任何帮助,所以我们最好这样做:
    1. 使用sqlall查看模型新的 CREATE TABLE 语句。 查看新创建的字段:
    $ python manage.py sqlall depotapp
    BEGIN;
    CREATE TABLE "depotapp_product" (
    "id" integer NOT NULL PRIMARY KEY,
    "title" varchar(100) NOT NULL UNIQUE,
    "description" text NOT NULL,
    "image_url" varchar(200) NOT NULL,
    "price" decimal NOT NULL,
    "date_available" date NOT NULL
    )
    ;
    COMMIT;


    2. 使用数据库命令行工具,或客户端工具,或者django提供的dbshell工具增加字段:
    $ python manage.py dbshell
    sqlite> begin;
    sqlite> alter table depotapp_product add column date_available date not null default 0;
    sqlite> commit;

    3. 验证数据库:
    $ python manage.py shell
    >>> from depot.depotapp.models import Product
    >>> Product.objects.all()
    如果没有异常发生,则可以在发布环境进行上述修改。

    以上是在模型中增加一个属性的步骤。其他对模型的修改可能还有:

    删除字段——drop column

    删除模型——drop table

    删除多对多关联——drop table (自动生成的关联表)

    也需要参考上述的步骤进行。

  • 相关阅读:
    Linux三剑客之sed深度实践讲解(上)
    Linux第三阶段题型测试
    Linux正则表达式题型
    linux文本处理三剑客命令及用法
    SSH服务协议、部署ssh、scp、sftp服务
    NFS客户端挂载及永久生效
    SSH实现无密码登录
    NFS深度解析及搭建同步NFS服务
    NFS文件系统及搭建NFS共享服务
    Linux系统磁盘管理
  • 原文地址:https://www.cnblogs.com/wuxl360/p/5787848.html
Copyright © 2011-2022 走看看