Django - models的基础用法

概述

Python 模型是与数据库相关联的,每个属性都是数据库的表字段。既然是数据库相关的那必然存在一些属性,本篇博客就是介绍其基础属性以及用法。

简单使用

一般models都是在app下models.py中进行编写的,当然也可以新建自己的目录包进行创建:

from django.db import models

class User(models.Model):
    name = models.CharField(max_length=100, verbose_name='用户名')
    psw = models.CharField(max_length=50, verbose_name='密码')
    
    def __str__(self):
        return self.name

接下来执行两条命令进行迁移到数据库:

准备:python manage.py makemigrations 
执行:python manage.py migrate :

这样数据库表app_user就创建好了。如果想在Django自带的管理系统中看到需要到admin中进行注册,一下为简单注册示例:

from django.contrib import admin
from app.models import User
class UserAdmin(admin.ModelAdmin):
   pass
admin.site.register(User, UserAdmin)

延伸扩展

很显然简单的使用肯定不满足日常使用,Django 为models提供了许多field 。
详情可见官网:Model field reference

Django提供了许多表字段类型:

    'AutoField', 'BLANK_CHOICE_DASH', 'BigAutoField', 'BigIntegerField',
    'BinaryField', 'BooleanField', 'CharField', 'CommaSeparatedIntegerField',
    'DateField', 'DateTimeField', 'DecimalField', 'DurationField',
    'EmailField', 'Empty', 'Field', 'FieldDoesNotExist', 'FilePathField',
    'FloatField', 'GenericIPAddressField', 'IPAddressField', 'IntegerField',
    'NOT_PROVIDED', 'NullBooleanField', 'PositiveIntegerField',
    'PositiveSmallIntegerField', 'SlugField', 'SmallIntegerField', 'TextField',
    'TimeField', 'URLField', 'UUIDField',

实际意义也比较好理解,特有类型Django内部还会校验合法性比如:URLField、IPAddressField、UUIDField。

Django提供了许多表字段属性

某些字段有自己的特有属性,而且还属于必填项,比如CharField必须声明长度。

常用属性介绍

  • null
    如果是True,则运行为null,否则不允许,默认False

  • blank
    如果是True,则允许为null,否则不允许,默认False
    注意:null的设置根数据库相关但是blank则是跟用户输入的表单验证有关,如果null设置了False blank 设置了True则会冲突报错。

  • choices
    表单中的选择列表,列表、元组。每个元组的第一个元素是存储在数据库中的值,第二个元素是展示的显示值

choices=(('1', '实战课'), ('2', '免费课'), ('0', '其他'))
choices=(('1', '男'), ('2', '女'), ('0', '保密'))

官方example

YEAR_IN_SCHOOL_CHOICES = [
    ('FR', 'Freshman'),
    ('SO', 'Sophomore'),
    ('JR', 'Junior'),
    ('SR', 'Senior'),
]
class Student(models.Model):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
    YEAR_IN_SCHOOL_CHOICES = [
        (FRESHMAN, 'Freshman'),
        (SOPHOMORE, 'Sophomore'),
        (JUNIOR, 'Junior'),
        (SENIOR, 'Senior'),
    ]
    year_in_school = models.CharField(
        max_length=2,
        choices=YEAR_IN_SCHOOL_CHOICES,
        default=FRESHMAN,
    )

    def is_upperclass(self):
        return self.year_in_school in (self.JUNIOR, self.SENIOR)

多级选择也是可以的:

MEDIA_CHOICES = [
    ('Audio', (
            ('vinyl', 'Vinyl'),
            ('cd', 'CD'),
        )
    ),
    ('Video', (
            ('vhs', 'VHS Tape'),
            ('dvd', 'DVD'),
        )
    ),
    ('unknown', 'Unknown'),
]
  • default
    默认值

  • max_length
    最大长度

  • db_column
    如果不想使用Django自动生成的数据库表列名(app_model),可以使用这个属性信息自定义列名

  • db_index
    True创建数据库索引,默认False

  • editable
    表单是否可编辑,如果设置成False,在Django管理页面上则看不到

  • error_messages
    表单验证的错误提示

  • help_text
    帮助、提示、说明

  • verbose_name
    Django管理页面显示的属性对应的属性名

  • primary_key
    如果您没有为模型中的任何字段指定primary_key=true,Django将自动添加一个autofield来保存主键,因此您不需要在任何字段上设置primary_key=true,除非您想覆盖默认的主键行为。有关更多信息,请参见自动主键字段。

  • unique
    数据库唯一约束

  • unique_for_date
    日期唯一

  • unique_for_month
    月份唯一

  • validators
    自定义数据验证,校验器

from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
def validate_dis_range(value):
    if value not in range(0, 101):
        raise ValidationError(
            _('%(value)s 范围必须是0-100'),
            params={'value': value}
        )
 we_chat_dis = models.PositiveSmallIntegerField(default=100, verbose_name='微信折扣', help_text='0-100',
                                                   validators=[validate_dis_range])
  • auto_now
    Date相关的Field才有的属性,表示修改、新增才会自动生成的日期
  • auto_now_add
    Date相关的Field才有的属性,表示新增才会自动生成的日期

Meta

    class Meta:
      """元数据:可对表信息进行修改"""
        verbose_name = '线路信息'
        verbose_name_plural = verbose_name

表之间的对应关系

一对一

OneToOneField
比如老师跟助教的关系,一个老师有一个助教(不接受抬杠)

助教表中添加
teacher = models.OneToOneField(Teacher, null=True, blank=True, on_delete=models.SET_NULL,
                                   verbose_name='讲师')  # on_delete=models.SET_NULL:一对一关系,级联关系为置空

一对多

ForeignKey
比如一个1们课程多个老师

课程表
teacher = models.ForeignKey(Teacher, null=Teacher, blank=True, on_delete=models.CASCADE,
                                verbose_name='课程教师')  # 删除级联,多对一的关系

多对多

ManyToManyField
比如学生对课程

学生表
 course = models.ManyToManyField(Course,verbose_name='课程')  # 多对多
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴唐人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值