Django框架学习——7—(创建Django步骤、模型常用字段实例、外键和表关系)

创建Django项目步骤

创建新的Django项目和app模块
在这里插入图片描述
在项目settings.py文件中设置新的数据库配置等

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'book',                                 # 项目app
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, "templates")],                          # 加载模板文件路径
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

DATABASES = {
    'default': {
         # 修改数据库引擎
        'ENGINE': 'django.db.backends.mysql',
        # 数据库名字
        'NAME': 'django_db3',
        # 用户名
        "USER": "root",
        # 密码
        "PASSWORD": "root",
        # 地址
        "HOST": '127.0.0.1',
        # 端口
        "PORT": 3306,
    }
}

模型文件创建:book/models.py

from django.db import models


class Article(models.Model):
    aid = models.AutoField(primary_key=True)
    

数据库中创建相同名称的表
在这里插入图片描述
生成迁移脚本文件,并映射到数据库文件:
在这里插入图片描述

1、模型常用字段实例

关于时区问题修改settings.py文件

# TIME_ZONE = 'UTC'                            # 格林威治时间,时区
TIME_ZONE = 'Asia/Shanghai'                    # 改为中国时区

USE_I18N = True

USE_L10N = True

# USE_TZ = True
USE_TZ = False                                # 修改时区时,需要修改这个参数为False

在这里插入图片描述
views.py文件

from django.shortcuts import render,redirect,reverse
from .models import Article
from django.http import HttpResponse
from datetime import datetime              # 没有时区的时间
# Django带有时区的时间  UTC时区,需要在settings.py文件中的进行设置


def index(request):
    # article = Article(title="python")
    # article.save()
    # return HttpResponse("shouye")
    
    # articles = Article.objects.all()
    # return render(request, "index.html", context={"articles": articles})

    article = Article(title="python", age=datetime.now())
    article.save()
    return HttpResponse("shouye")

模型文件:models.py

from django.db import models


class Article(models.Model):
    aid = models.AutoField(primary_key=True)
    is_delete = models.BooleanField(null=True)          # null  非空
    title = models.CharField(max_length=50)             # charfield必须给max_length
    birthday = models.DateTimeField(null=True, auto_now_add=True)        # auto_now_add=True这个时间是带有时区的时间,是第一条数据保存的时间
    age = models.DateTimeField(auto_now=True)                            # auto_now=True是修改数据时候会保存的时间
    email = models.EmailField(null=True)           # EmailField没有验证的功能,需要在Form表单中才能验证邮箱的格式
	url = models.URLField(null=True)               # URLField没有验证的功能,需要在Form表单中才能验证url的格式
		

class User(models.Model):
    # 不同类型数据的限制是Django框架中的限制,不是数据库中的限制
    uid = models.BigAutoField(primary_key=True)

需要注意的是DateTimeField中的时区设置和auto_now_add=True、auto_now=True的区别;EmailFieldURLField没有验证格式的功能,需要在Form表单中才能验证格式的正确性。


class User(models.Model):
    # 不同类型数据的限制是Django框架中的限制,不是数据库中的限制
    uid = models.BigAutoField(primary_key=True)
    '''null 默认是为False。在使用字符串相关的Field(CharField/TextField)的时候,
    官方推荐尽量不要使用这个参数,也就是保持默认值False。
    因为Django在处理字符串相关的Field的时候,即使这个Field的null=False,
    如果你没有给这个Field传递任何值,那么Django也会使用一个  空的字符串  " "来作为默认值存储进去。
    因此如果再使用null=True,Django会产生两种空值的情形(NULL或者空字符串)。'''
    name = models.CharField(max_length=20, null=False)
    # pwd是Django中的ORM模型名称字段,db_column="password"中的password是数据库层面的名称
    pwd = models.CharField(max_length=20, db_column="password", null=True)
    # 唯一性unique     
    telephone= models.CharField(max_length=20, unique=True, null=True)    

注意:null 默认是为False。在使用字符串相关的Field(CharField/TextField)的时候,
官方推荐尽量不要使用这个参数,也就是保持默认值False。
因为Django在处理字符串相关的Field的时候,即使这个Field的null=False,
如果你没有给这个Field传递任何值,那么Django也会使用一个 空的字符串 " "(不同于null)来作为默认值存储进去。 因此如果再使用null=True,Django会产生两种空值的情形(NULL或者空字符串)

2、模型中Meta配置

对于一些模型级别的配置。我们可以在模型中定义一个类,叫做Meta。然后在这个类中添加一些类属性来控制模型的作用。比如我们想要在数据库映射的时候使用自己指定的表名,而不是使用模型的名称。那么我们可以在Meta类中添加一个db_table的属性。

class Book(models.Model):
    name = models.CharField(max_length=20,null=False)
    desc = models.CharField(max_length=100,name='description',db_column="description1")

    class Meta:
        db_table = 'book_model'

db_table

这个模型映射到数据库中的表名。如果没有指定这个参数,那么在映射的时候将会使用模型名来作为默认的表名。

ordering

设置在提取数据的排序方式。比如想在查找数据的时候根据添加的时间排序。

class Book(models.Model):
    name = models.CharField(max_length=20,null=False)
    desc = models.CharField(max_length=100,name='description',db_column="description1")
    pub_date = models.DateTimeField(auto_now_add=True)

    class Meta:
        db_table = 'book_model'
        ordering = ['pub_date']     # 正序
        ordering = ['-pub_date']    # 倒序

实例如下

class User(models.Model):
    # 不同类型数据的限制是Django框架中的限制,不是数据库中的限制
    uid = models.BigAutoField(primary_key=True)
    name = models.CharField(max_length=20, null=False)
    # pwd是Django中的ORM模型名称字段,db_column="password"中的password是数据库层面的名称
    pwd = models.CharField(max_length=20, db_column="password", null=True)
    age = models.IntegerField(default=0, null=True)
    telephone = models.CharField(max_length=20, unique=True, null=True)
    
    def __str__(self):
        return "User中的排序:uid%s , username:%s" % (self.uid, self.username)
    
    # 类中添加一些类属性
    class Meta:
        db_table = 'user'           # 数据库映射时,使用指定的表名user
        # 正序
        # ordering = ['uid']
        # 倒序
        # ordering = ['-uid']

        ordering = ['-uid', 'age']   # 先按照uid倒序排,再按照age正序排

3、外键和表关系

在MySQL中,表有两种引擎,一种是InnoDB,另外一种是myisam。如果使用的是InnoDB引擎,是支持外键约束的。外键的存在使得ORM框架在处理表关系的时候异常的强大。因此这里我们首先来介绍下外键在Django中的使用。

设置默认引擎
在这里插入图片描述
类定义为class ForeignKey(to,on_delete,**options)。第一个参数是引用的是哪个模型,第二个参数是在使用外键引用的模型数据被删除了,这个字段该如何处理,比如有CASCADE、SET_NULL等。这里以一个实际案例来说明。比如有一个Category和一个Article两个模型。一个Category可以有多个文章,一个Article只能有一个Category,并且通过外键进行引用。

class Category(models.Model):
    name = models.CharField(max_length=100)

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    # author = models.ForeignKey("User",on_delete=models.CASCADE)
    category = models.ForeignKey("Category",on_delete=models.CASCADE)

在这里插入图片描述
article/views.py

from django.shortcuts import render
from django.http import HttpResponse
from .models import Category, Article


def news(request):
    # 添加数据
    # category = Category(name="python")         # 必须用指定参数name=
    # category.save()
    # article = Article(title="python入门", content="xxx")
    # # 外键   相当于article.category_id = category
    # article.category = category
    # article.save()
    # return HttpResponse("新闻页")

    # 查询数据    第一种方法
    article = Article.objects.get(pk=1)
    print(article.category_id)                            # category_id是外键自动创建的
    category = Category.objects.get(pk=article.category_id)
    print(category.name)                                  # python

    # 另一种直接的写法,外键找到分类的模型,再查找模型中的属性
    print(article.category.name)                         # python
    return HttpResponse("新闻页")

注意:添加settings.py中的INSTALLED_APPS项目app名称;还有项目中的urls.py文件绑定路由。

from django.contrib import admin
from django.urls import path
from book import views
from article import views as n          # 防止重名引用


urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.index),
    path('new/', n.news),
]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值