Django模型类

本文详细介绍了Django框架中各种模型字段的使用方法,包括基本字段类型如CharField、TextField,特殊字段类型如UUIDField、AutoField,以及关联字段如ForeignKey、ManyToManyField等。同时还涵盖了字段参数、元选项等高级特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新建模型类

  • 继承django.db.models.Model,如下所示:
    from django.db import models

    class Person(models.Model):
        first_name = models.CharField(max_length=30)
        last_name = models.CharField(max_length=30)

字段类型

AutoField:

  • 自增序列,如果没有指定主键,django默认自增序列ID为主键列
  • 显式的方式设置主键列,如下:
    id = models.AutoField(primary_key=True)

UUIDField:

  • uuid类型,具有全局唯一性,可作为主键
  • 设置uuid为主键的代码示例:
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    # 重复的概率极低,比买彩票中头奖的概率还低,在没重复之前已经受到Django性能制约了。

文本类型

1、CharField:字符串

  • 例一:定义一个名称为名称的可为空并且最大长度为128字符的字符字段。
    name = models.CharField(max_length=128,verbose_name='名称',null=True,blank=True)
  • 例二:设置choices属性
    asset_type_choices = (
        ('1', '交换机'),
        ('2', '路由器'),
        ('3', '风扇')
    )
    asset_type = models.CharField(choices=asset_type_choices,max_length=128,verbose_name='类型',null=True,blank=True)
  • 最佳实践:自定义choices,
    class BusinessInfo(models.Model):
        line_status = models.CharField(max_length=128,null=True,blank=True,help_text='line_status_choices',verbose_name='线路状态')
        
        choices_dict = {
            'line_status':'line_status_choices',
        }
        
        def __init__(self,*args,**kwargs):
            super(BusinessInfo,self).__init__(*args,**kwargs)
            for field,group_key in self.choies_dict.items():
                
                # get_dict_group_by_key 返回值形如:asset_type_choices
                self._meta.get_field(field).choices = get_dict_group_by_key(group_key) 
               

2、TextField:大文本类型

  • 例一:
    description = models.TextField(null=True,blank=True,verbose_name='描述')

布尔值

BooleanField与NullBooleanField

  • BooleanField:bool值。
  • NullBooleanField:可为空的bool值,如果表已经建好,需要添加一个bool值得字段,那么只能用这种方式。
    lock = models.BooleanField(default=False,verbose_name='是否锁定')
    
    is_mount = models.NullBooleanField(default=False,verbose_name='是否挂载',null=True,blank=True)
    

日期与时间

1、DateField:日期类型,精确到年月日 格式:"%Y-%m-%d"

    buy_date = models.DateField(null=True,black=True,verbose_name='购买日期')

2、DateTimeField:时间类型是,精确到时分秒 格式::"%Y-%m-%d %H:%M:%S"

    create_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间',null=True,blank=True)
    update_time = models.DateTimeField(auto_now=True,verbose_name='更新时间',null=True,blank=True)

数字类型

1、IntergerField:整数

    order = models.IntegerField(default=1000,verbose_name='序列号',null=True,blank=True)

2、FloatField:浮点数

    rate = models.FloatField(null=True,blank=True,verbose_name='速率')

3、DecimalField:精确数字

    price = models.DecimalField(verbose_name='合同金额',null=True,blank=True,max_digits=8,decimal_places=2)
    # 最长8位,小数位数2位。

文件

1、FileField:文件类型

2、FilePathField:文件路径类型

3、ImageField:图像类型,自动校验是否为图片格式

IP地址

1、GenericIPAddressField:IP类型,支持IPV4和IPV6

  • 入库时,Django会校验是否为IP地址格式。
    node = models.GenericIPAddressField(verbose_name='管理地址',unique=True,null=True,blank=True)

ForeignKey:外键

1、普通外键

  • 第一个参数:外键表
  • related_name: 外键表实例中子表的列表的名称 如:contract1.assets
  • on_delete: 值为models.CASCADE时,当删除父表记录时,子表级联删除
    contract = models.ForeignKey('Contract',related_name='assets',verbose_name='所属合同',on_delete=models.CASCADE,null=True,blank=True)
    
    # 如果外键表不在同一个应用中
    use_org = models.ForeignKey('user_manager.Organization',related_name='assets',verbose_name='使用机构',on_delete=models.CASCADE)
    

2、自关联

  • 注意事项:入库的时候需要注意入库顺序,父在前,子在后。
    mount_dev = models.ForeignKey('self',related_name='assets',verbose_name='挂在设备',on_delete=models.CASCADE,null=True,blank=True)

ManyToManyField:多对多

    class Role(models.Model):
        name = models.CharField(max_length=50,blank=True,null=True,verbose_name='角色')
    
    class UserProfile(models.Model):
        roles = models.ManyToManyField(Role)
      
    
    user = UserProfile.objects.all().first()
    user.roles # 当前用户拥有的角色,是一个查询集(QuerySet)
    

OneToOneField:一对一

    from django.conf import settings
    from django.db import models
    from django.contrib.auth.mdoels import User

    class MySpecialUser(models.Model):
        user = models.OneToOneField( settings.AUTH_USER_MODEL,on_delete=models.CASCADE, )
        supervisor = models.OneToOneField(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,related_name='supervisor_of',)
        user1 = OneToOneField(User,on_delete=models.CASCADE)
        

字段类型参数

  1. null:数据库中是否可为空。
  2. blank:后台管理界面是否检验必填项。
  3. choices: 键值选项。
  4. db_column: 数据库对应列明,默认为属性名。
  5. db_index:如果为True,将在此列建立数据库索引。
  6. default:默认值。
  7. help_text:帮助文档,可用于自定义choices。
  8. primary_key:是否主键。
  9. unique:唯一性。
  10. verbose_name:显示名称

  1. auto_now_add:针对时间类型,创建时赋值为当前时间。
  2. auto_now:针对时间类型,每次修改时赋值为当前时间。

元选项(Meta)

    class User(AbstractUser):
    '''用户模型类'''

    class Meta:
        abstract = True # 虚拟表,不会创建实体表 
        db_table = 'df_user' # 设置数据中的表名
        verbose_name = '用户'  
        verbose_name_plural = verbose_name
        ordering = ['ordering'] # 查询集默认排序列
        unique_together = ('series','name') # 多列组合唯一性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值