zoukankan      html  css  js  c++  java
  • 一步步学习Python-django开发-建立django数据库

    上篇文章建立了一个空的网站。现在我们要准备正式我们的网站开发咯。那么开发的第一步是啥呢?当然是要确定做什么网站了。每个人的开发习惯可能不尽相同,有点可能是从前端开始设计,有的可能是从数据库开始设计(不得不说django在数据库操作方面是很强大的)。我属于后者,因为我对前端不太熟悉,哈哈!

    我要做一个公司内部团体订餐系统,方便统一订餐。功能需求很简单:公司每天要订餐,订餐每天定一家餐馆的菜。

    我想到需要建立如下数据库表:餐馆(Restaurant)、商品分类(Category)、商品(good)、消费者(Custom)、消费者评论(Comment )、菜(Menu每个消费者可能有多个菜),订单(Order 每天订单次数基本固定)。具体到每个表的关键字,在后面会看到。

    好了分析好了我们需要的数据结构,我们就利用Python-django构建我们的数据库,由于此系统对数据库的要求不高,我们使用默认的sqlite:

    1. 首先我们要建立一个app(为啥叫app,待后续分解)。我们建立一个名为polls(名字你随意):python manage.py startapp polls

    2. 如果执行成功,会再工程目录下生成一个polls目录。

    3. 设计数据库结构及映射关系:django采用ORM(对象关系映射)来创建数据库。你要建立的数据库,需要修改polls app目录下的models.py 文件。在此文件中添加对象及对象之间的映射关系,以下为我的修改,添加了之前说明的数据库表:

     1 from django.db import models
     2 
     3 # Create your models here.
     4 
     5 class Restaurant(models.Model):
     6     name = models.CharField(max_length=50)
     7     URL = models.CharField(max_length=200, default="")
     8 
     9     def __str__(self):
    10         return self.name
    11 
    12 class Category(models.Model):
    13     name = models.CharField(max_length=50)
    14 
    15     def __str__(self):
    16         return self.name
    17 
    18 class Good(models.Model):
    19     name = models.CharField(max_length=50)
    20     price = models.FloatField()
    21     description = models.CharField(max_length=200)
    22     category = models.ForeignKey(Category)
    23     restaurant = models.ForeignKey(Restaurant)
    24 
    25     def __str__(self):
    26         return self.name
    27 
    28 class Custom(models.Model):
    29     name = models.CharField(max_length=20)
    30     sex = models.BooleanField()
    31     age = models.IntegerField()
    32     department = models.IntegerField()
    33 
    34     def __str__(self):
    35         return self.name
    36 
    37 class CustomComment(models.Model):
    38     content = models.CharField(max_length=200)
    39     score = models.IntegerField()
    40     good = models.ForeignKey(Good)
    41     custom = models.ForeignKey(Custom)
    42 
    43     def __str__(self):
    44         return self.content
    45 
    46 class Order(models.Model):
    47     name = models.CharField(max_length=50, default= "晚餐")
    48     date = models.DateTimeField()
    49 
    50     def __str__(self):
    51         return self.date
    52 
    53 class Menu(models.Model):
    54     order = models.ForeignKey(Order)
    55     good = models.ForeignKey(Good)
    56     custom = models.ForeignKey(Custom)
    57 
    58     def __str__(self):
    59         return self.order
    60     

    4. 将以上数据库表信息及映射关系应用到真实的数据库中:

    • 根据model生成具体操作文件,告诉django你的数据库变化:python manage.py makemigrations polls
    • 上述操作会生成一个以序号开头文件,首次是0001,之后每次操作加1,要做修改修改指令后面对应的数字即可,我们要利用这个文件生成具体操作数据库的sql语句:python manage.py sqlmigrate polls 0001
    • 好了有了sql语句我们就可以真正修改数据了:python manage.py migrate
    • 有时候我们的第一次设计的数据库并不是完美的,如果添加新的非空列,在model中要设置default值。上面的生成sql语句的指令注意使用新的序号。
    • 你可以通过python命令行体验具体如何操作数据:

        

    $python manage.py shell
    >>> import django
    >>> django.setup()
    >>> from polls.models import Restaurant, Category,Good #引入数据对象
    >>> Restaurant.objects.all() #查询所有餐馆数据
    >>> r = Restaurant(name = "宇宙卷饼", URL = "http://waimai.baidu.com/waimai/shop/598777734712241745")
    >>> r.save()
    >>> c = Category(name = "热卖")
    >>> c.save()
    >>> g = Good(name = "酱香鸡腿肉卷(中份)", price = 20, description = "美味", category = c, restaurant = r, times = 0)
    >>> g.save()
    >>> g.name #查询存储结果
    >>> g.category.name
    >>> g.restaurant.name

    6. 我再django.setup()时遇到以下问题,其实出现这个问题的是python打开的姿势不对,应当使用python manage.py shell 但是你错误的姿势还是可以补救的,以下就是补救措施:

    问题:django.core.exceptions.ImproperlyConfigured: Requested setting LOGGING_CONFIG, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

    解决方法:

    $python
    
    >>> import os
    
    >>> os.environ['DJANGO_SETTINGS_MODULE'] = 'cookbook.settings'
    
    >>> import django
    
    >>> django.setup()

    7. 数据库以及表的名字是很重要的,一定要想好,而django是根据你建立的app名称做表名前缀的。所以你一定要注意app名称。在我们刚建立一个数据库,数据库中还没有填充内容还是可以补救的(不推荐)。才开始学习,由于对app的概念不是很熟悉,我就犯了这样的错我。我是这么解决的,这中方案只是在开发最开始阶段有效。

    1. 修改app目录名称为你的名称:我将我的polls修改为books。然后修改settings.py 的INTALLED_APPS中的polls为books。备份原有的生产的数据库文件。然后删除数据库文件,修改 migrations目录下的带序号文件中的polls为books。然后执行 python manage.py makemigrations books 没有错误的话应该提示没有变化。然后依次对每个序号文件执行迁移到数据库的两条指令:python manage.py sqlmigrate books 0001 和 python manage.py migrate。现在你的数据库完成了修改,如果你原来的数据库还有数据,你就可以通过某种方式(你可以写一个简单的sql脚本,注意主外键关系)吧原有数据库内容重新导入到新的数据库中。

    好了现在数据库创建完毕,我们也进行了测试

  • 相关阅读:
    Java的final关键字
    递归
    打开Eclipse时出现"The Eclipse executable launcher was unable to locate its companion shared library"情况的解决
    warning: LF will be replaced by CRLF in test.txt.
    Java类的初始化问题
    递归输入与引用传值(UVa839 Not so Mobile)
    UVa1599 Ideal Path(双向bfs+字典序+非简单图的最短路+队列判重)
    欧拉图和欧拉圈-Play On Words(UVa10129)
    UVA12096 集合栈计算机(map和vector实现双射关系+集合的交并运算的STL)
    WebStorm快捷键
  • 原文地址:https://www.cnblogs.com/inbase/p/4770317.html
Copyright © 2011-2022 走看看