django学习路程-2

django从入门到入坑(二)

  1. 创建模型
    Django通过自定义Python类的形式来定义具体的模型,每个模型的物理存在方式就是一个Python的类Class,每个模型代表数据库中的一张表,每个类的实例代表数据表中的一行数据,类中的每个变量代表数据表中的一列字段。Django通过模型,将Python代码和数据库操作结合起来,实现对SQL查询语言的封装。也就是说,你可以不会管理数据库,可以不会SQL语言,你同样能通过Python的代码进行数据库的操作。Django通过ORM对数据库进行操作,奉行代码优先的理念,将Python程序员和数据库管理员进行分工解耦。

    在这个简单的投票应用中,我们将创建两个模型:Question和Choice。Question包含一个问题和一个发布日期。Choice包含两个字段:该选项的文本描述和该选项的投票数。每一条Choice都关联到一个Question。这些都是由Python的类来体现,编写的全是Python的代码,不接触任何SQL语句。现在,编辑polls/models.py文件:

    from django.db import models
    
    
    class Question(models.Model):
        question_text = models.CharField(max_length=200)
        pub_date = models.DateTimeField('date published')
    
    
    class Choice(models.Model):
        question = models.ForeignKey(Question, on_delete=models.CASCADE)
        choice_text = models.CharField(max_length=200)
        votes = models.IntegerField(default=0)
    
  2. 启用模型
    上面的代码看着有点少,其实包含了大量的信息,据此,Django会做下面两件事:

    • 创建该app对应的数据库表结构
    • 为Question和Choice对象创建基于Python的数据库访问API

    但是,首先我们得先告诉Django项目,我们要使用这个app。需要将应用添加到项目中,需要在INSTALLED_APPS设置中增加指向该应用的配置文件的链接。对于本例的投票应用,它的配置类文件PollsConfig是polls/apps.py,所以它的点式路径为polls.apps.PollsConfig。我们需要在INSTALLED_APPS中,将该路径添加进去:

    # mysite/settings.py
    
    INSTALLED_APPS = [
    'polls.apps.PollsConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    ]
    

    然后需要将其加入到整个项目中,执行一条命令即可:

    python manage.py makemigrations polls
    
  3. 使用模型API
    通过命令进入python的shell环境:

    python manage.py shell
    

    进入shell后,就可以开始尝试以下的API了:

    >>> from polls.models import Question, Choice # 导入我们写的模型类
    # 现在系统内还没有questions对象
    >>> Question.objects.all()
    <QuerySet []>
    
    # 创建一个新的question对象
    # Django推荐使用timezone.now()代替python内置的datetime.datetime.now()
    # 这个timezone就来自于Django的依赖库pytz
    from django.utils import timezone
    >>> q = Question(question_text="What's new?", pub_date=timezone.now())
    
    # 你必须显式的调用save()方法,才能将对象保存到数据库内
    >>> q.save()
    
    # 默认情况,你会自动获得一个自增的名为id的主键
    >>> q.id
    1
    
    # 通过python的属性调用方式,访问模型字段的值
    >>> q.question_text
    "What's new?"
    >>> q.pub_date
    datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
    
    # 通过修改属性来修改字段的值,然后显式的调用save方法进行保存。
    >>> q.question_text = "What's up?"
    >>> q.save()
    
    # objects.all() 用于查询数据库内的所有questions
    >>> Question.objects.all()
    <QuerySet [<Question: Question object>]>
    

    这里等一下:上面的<Question: Question object>是一个不可读的内容展示,你无法从中获得任何直观的信息,为此我们需要一点小技巧,让Django在打印对象时显示一些我们指定的信息。

    回到polls/models.py文件,修改一下question和Choice这两个类:

    from django.db import models
    
    class Question(models.Model):
        # ...
        def __str__(self):
            return self.question_text
    	def was_published_recently(self):
        	return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    class Choice(models.Model):
        # ...
        def __str__(self):
            return self.choice_text
    

    然后可以再次使用shell:

    >>> from polls.models import Question, Choice
    
    # 先看看__str__()的效果,直观多了吧?
    >>> Question.objects.all()
    <QuerySet [<Question: What's up?>]>
    
    # Django提供了大量的关键字参数查询API
    >>> Question.objects.filter(id=1)
    <QuerySet [<Question: What's up?>]>
    >>> Question.objects.filter(question_text__startswith='What')
    <QuerySet [<Question: What's up?>]>
    
    # 获取今年发布的问卷
    >>> from django.utils import timezone
    >>> current_year = timezone.now().year
    >>> Question.objects.get(pub_date__year=current_year)
    <Question: What's up?>
    
    # 查询一个不存在的ID,会弹出异常
    >>> Question.objects.get(id=2)
    Traceback (most recent call last):
    ...
    DoesNotExist: Question matching query does not exist.
    
    # Django为主键查询提供了一个缩写:pk。下面的语句和Question.objects.get(id=1)效果一样.
    >>> Question.objects.get(pk=1)
    <Question: What's up?>
    
    # 看看我们自定义的方法用起来怎么样
    >>> q = Question.objects.get(pk=1)
    >>> q.was_published_recently()
    True
    
    # 让我们试试主键查询
    >>> q = Question.objects.get(pk=1)
    
    # 显示所有与q对象有关系的choice集合,目前是空的,还没有任何关联对象。
    >>> q.choice_set.all()
    <QuerySet []>
    
    # 创建3个choices.
    >>> q.choice_set.create(choice_text='Not much', votes=0)
    <Choice: Not much>
    >>> q.choice_set.create(choice_text='The sky', votes=0)
    <Choice: The sky>
    >>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)
    
    # Choice对象可通过API访问和他们关联的Question对象
    >>> c.question
    <Question: What's up?>
    
    # 同样的,Question对象也可通过API访问关联的Choice对象
    >>> q.choice_set.all()
    <QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
    >>> q.choice_set.count()
    3
    
    # API会自动进行连表操作,通过双下划线分割关系对象。连表操作可以无限多级,一层一层的连接。
    # 下面是查询所有的Choices,它所对应的Question的发布日期是今年。(重用了上面的current_year结果)
    >>> Choice.objects.filter(question__pub_date__year=current_year)
    <QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
    
    # 使用delete方法删除对象
    >>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
    >>> c.delete()
    
  4. 创建admin
    很多时候,我们不光要开发针对客户使用的前端页面,还要给后台管理人员提供相应的管理界面。但是大多数时候为你的团队或客户编写用于增加、修改和删除内容的后台管理站点是一件非常乏味的工作并且没有多少创造性,而且也需要花不少的时间和精力。Django最大的优点之一,就是体贴的为你提供了一个基于项目model创建的一个后台管理站点admin。这个界面只给站点管理员使用,并不对大众开放。虽然admin的界面可能不是那么美观,功能不是那么强大,内容不一定符合你的要求,但是它是免费的、现成的,并且还是可定制的,有完善的帮助文档,那么,你还要什么自行车?
    创建管理员用户:

    python manage.py createsuperuser
    

    接着输入邮箱地址和密码就行,当输入密码的时候不会显示,所以请大家注意密码别乱输。
    在实际环境中,为了站点的安全性,我们一般不能将管理后台的url随便暴露给他人,不能用/admin/这么简单的路径。
    打开根url路由文件mysite/urls.py,修改其中admin.site.urls对应的表达式,换成你想要的,比如:

    from django.contrib import admin
    from django.urls import path
    
    urlpatterns = [
        path('polls/', include('polls.urls')),
        path('what/', admin.site.urls),
    ]
    
  5. 进入admin站点
    进入网站:http://127.0.0.1:233/what/
    会发现进入了admin管理后台,诸如下列情况:
    在这里插入图片描述
    此处发现只有groups和users,这是django.contrib.auth模块提供的身份认证框架,我们还需把自己写的Question导入进来:

    #mysite/polls/admin.py
    from django.contrib import admin
    from .models import Question
    
    admin.site.register(Question)
    

    如果发现整个页面的爆出error,那么一定是出现了些许问题,诸如数据库没上传成功导致的问题。
    在这里插入图片描述
    解决办法是输入命令python manage.py makemigrations后再执行python manage.py migrate,即可完美解决这类问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值