欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

创建Django步骤、模型常用字段实例、外键和表关系)

程序员文章站 2022-06-29 17:06:41
创建Django项目步骤创建新的Django项目和app模块在项目settings.py文件中设置新的数据库配置等INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.stat...

创建Django项目步骤

创建新的Django项目和app模块
创建Django步骤、模型常用字段实例、外键和表关系)
在项目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)
    

数据库中创建相同名称的表
创建Django步骤、模型常用字段实例、外键和表关系)
生成迁移脚本文件,并映射到数据库文件:
创建Django步骤、模型常用字段实例、外键和表关系)

1、模型常用字段实例

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

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

USE_I18N = True

USE_L10N = True

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

创建Django步骤、模型常用字段实例、外键和表关系)
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中的使用。

设置默认引擎
创建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)

创建Django步骤、模型常用字段实例、外键和表关系)
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),
]

本文地址:https://blog.csdn.net/weixin_42118531/article/details/107034540