Django 创建项目之模型

目录

  Django 模型

  Django 创建模型常用字段和参数

  Django 创建模型关联字段和参数

  Django 创建模型自定义字段和参数

  Django 自定义字段

  Django 操作已经存在的数据库

Django Models

使用Django写一个带有数据库的Web应用时,第一步就是定义模型。也就是数据库结构的设计

 1. 创建models。下面来编写app/models.py文件。

from django.db import models


class Employee(models.Model):
    id = models.AutoField(primary_key=True)  # 不写自动创建
    name = models.CharField(max_length=16)
    gender = models.BooleanField(default=1)  # 0女,1男
    birth = models.DateField(auto_now_add=True)
    department = models.CharField(max_length=32)
    salary = models.DecimalField(max_digits=10, decimal_places=1)

  def __str__(self):
    return self.name

说明:

  1. 每个模型都是django.db.models.Model的子类。

  2. 模型(类名、数据库表名):每个模型中的类名为数据库中的表名。

  3. 字段(类变量、数据库表字段名):每个模型模型中有许多类变量,它们都表示数据库表中字段。

  4. 字段类型:每个字段都是Field类的实例。比如:字符串字段被表示为:CharField,

   日期时间字段被表示DataTimeField。Django处理字段的数据类型。

2. 创建数据库表

2.1 运行上述命令Django会检测你对models.py文件的修改,并把修改的部分存储为一次迁移。

python3 manage.py makemigrations app

3.2 migate 在数据库中创建新定义的模型的数据表。

python3 manage.py migrate app

知识:

1. 查看修改models.py文件后所执行的sql语句

python3 manage.py sqlmigate chromeVirt 0001

  input log:

2. 检测项目中的问题,检测的过程中并不会对数据库进行操作。

python3 manage.py check

  input log:

System check identified no issues (0 silenced).

Django 模型常用字段和参数

字段

AutoField

  主键,int类型,自增列,必须填入参数 primary_key=True。当models中如果没有自增列,则自动创建一个列名为id的列。

IntegerFiled

  整数类型,范围在 -2147483648 到 2147483647。

CharField

  字符类型,必须提供max_length参数, max_length表示字符长度。如:max_length=64。

DataField

  日期字段,日期格式  YYYY-MM-DD,相当于Python中的datetime.date()实例。

  auto_now_add=True,创建数据记录的时候会把当前的时间添加到数据库

  auto_now=True,每次更新数据记录的时候都会更新该字段

DataTimeField

  日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例

BooleanField

  布尔类型,填数字0、1

EmailField

  字符串类型,Django Admin以及ModelForm中提供验证机制。

URLField

  字符串类型,Django Admin以及ModelForm中提供验证URL

TextField

  文本类型

FileField

  字符串,路径保存在数据库,文件上传到指定目录

  参数: 

  upload_to="",上传文件的保存路径

  storage=None,存储组件,,默认 (django.core.files.storage.FileSystemStorage)

ImageField

  字符串,路径保存在数据库,文件上传到指定目录

  参数: 

  upload_to = "",上传文件的保存路径

DecimalField

  10进制小数

  参数: 

  max_digits,小数总长度

  decimal_places,小数位长度

参数

null:用于表示某个字段可以为空。如:null=True。

unique:如果设置unique=True,则该字段在此表中必须唯一。

db_index:如果db_index=True,则代表着为该字段设置索引

default:为该字段设置默认值

DateField和DateTimeField字段

  auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库

  auto_now=True,每次更新数据记录的时候都会更新该字段

verbose_name:Admin中显示的字段名。

blank:Admin中是否允许用户输入为空。

editable:Admin中是否可以编辑。

help_text:Admin中该字段的提示信息。

choices:Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作。

"""
choices:
 1:能够罗列出一个的所有结果.比如: 性别,学历,
 2:数据库中存数字代表男女,怎样从数据库中取出的是中文
    get_gender_display: get_字段名_display
"""
class User(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    # choices变量名可也随便取,最好见名知意.比如:性别应该是gender_choices
    gender_choices = (
        (0,'男'),(1,'女'),(2,'其它')
    )
    gender = models.IntegerField(choices=gender_choices)

book_obj = models.User.objects.filter(pk=1).first()
book_obj.get_gender_display()

关联字段

ForeignKey    多对一

  在ORM模型中,关联字段建立"多"的一方

OneToOneField     一对一

  通常一对一字段用来扩展已有字段,关联字段建立在查询频繁的一方

ManyToManyField  多对多

  through

  在使用ManyToManyField字段时,Django将会自动生成一张表来管理多对多的关联关系。

  但我们也可以手动创建第三张表来管理多对多关系,,此时就需要通过through来指定第三方的表名。

  through_fields:设置关联字段

  db_table:默认创建第三张表时, 数据库中表的名称

class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name="书名")


# 自己创建第三张表,并通过ManyToManyField指定关联
class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name="作者姓名")
    books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book"))
    # through_fields接受一个2元组('field1','field2'):
    # 其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名。


class Author2Book(models.Model):
    author = models.ForeignKey(to="Author")
    book = models.ForeignKey(to="Book")

    class Meta:
        unique_together = ("author", "book")

参数:

to:设置要关联的表. 如: to=Book

to_field:设置要关联的表的字段. 如: to_field=book_id

related_name:反向操作时, 使用的字段名, 用于代替反向查询时的"表名_set". 如: related_name="book"

db_constraint:是否在是数据库中创建外键约束, 默认为True, db_constraint=False断开表连接

on_delete:当删除关联表中的数据时,当前表与其关联的行的行为。

models.CASCADE:删除关联数据,与之关联也删除

models.DO_NOTHING:删除关联数据,引发错误IntegrityError

models.PROTECT:删除关联数据,引发错误ProtectedError

models.SET_NULL:删除关联数据,与之关联的值设置为null(前提关联字段需要设置为可空)

models.SET_DEFAULT:删除关联数据,与之关联的值设置为默认值(前提关联字段需要设置默认值)

models.SET: 删除关联数据。a. 与之关联的值设置为指定值,设置:models.SET(值) b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

Django 自定义字段

1. 自定义char类型字段

class FixedCharField(models.Field):
    """
    自定义的char类型的字段类
    """
    def __init__(self, max_length, *args, **kwargs):
        self.max_length = max_length
        super(FixedCharField, self).__init__(max_length=max_length, *args, **kwargs)

    def db_type(self, connection):
        """
        限定生成数据库表的字段类型为char,长度为max_length指定的值
        """
        return 'char(%s)' % self.max_length


class Class(models.Model):
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=25)
    # 使用自定义的char类型的字段
    cname = FixedCharField(max_length=25)

Django 操作已经存在的数据库表

1. 把已经存在的数据库映射到models中,就可以看到已经存在的数据库。

python3 manage.py inspectdb >app/models.py

  

 

 

 

posted @ 2022-01-01 15:24  zhuang6  阅读(293)  评论(0)    收藏  举报