Django ORM字段类型及字段类型和model之间的关系一对一一对多

Django ORM字段类型及字段类型和model之间的关系一对一一对多

字符串类型

CharField() # 字符类型   -参数: 必须提供max_length参数, 表示字符长度 如
CharField(max_length=10) TextField() # 文本类型 EmailField()   # Django
Admin以及ModelForm中提供验证机制 IPAddressField()    # Django
Admin以及ModelForm中提供验证 IPV4 机制 GenericIPAddressField(Field)    # Django
Admin以及ModelForm中提供验证 Ipv4和Ipv6 (推荐) URLField()   # Django
Admin以及ModelForm中提供验证 URL SlugField()   # Django
Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) FilePathField()    # Django
Admin以及ModelForm中提供读取文件夹下文件的功能
  - 参数:
    path, 文件夹路径
    match=None, 正则匹配
    recursive=False, 递归下面的文件夹
    allow_files=True, 允许文件
    allow_folders=False, 允许文件夹
"""注:EmailField、GenericIPAddressField、URLField等仅给django-admin使用时才有特殊功能,如果不用admin,和CharField一样都表示普通字符串"""

数字类型

整型   IntegerField(Field) - 整数列(有符号的) -21474836482147483647
  PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField) -
正整数 02147483647   SmallIntegerField(IntegerField): - 小整数 -3276832767   BigIntegerField(IntegerField): - 长整型(有符号的)
-9223372036854775808 - 9223372036854775807

浮点型   FloatField(Field)   DecimalField(Field) # 10进制小数

参数: max_digits,小数总长度 decimal_places,小数位长度 BinaryField(Field) # 二进制类型

布尔值

BooleanField(Field) - 布尔值类型 NullBooleanField(Field) - 可以为空的布尔值
自定义自增列 (当model中如果没有自增列,则自动会创建一个列名为id的列)   AutoField(primary_key=True) 必须填入参数 primary_key=True

时间类型

DateTimeField(DateField) - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
DateField(DateTimeCheckMixin, Field) - 日期格式 YYYY-MM-DD
TimeField(DateTimeCheckMixin, Field) - 时间格式 HH:MM[:ss[.uuuuuu]]
DurationField(Field) - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型

字段属性

null    -> db是否可以为空
default    -> 默认值
primary_key   -> 主键
db_column=‘xxx’   -> 列名
db_index=True   -> 索引
unique    -> 唯一索引
unique_for_date    -> 数据库中字段【日期】部分是否可以建立唯一索引
unique_for_month  -> 数据库中字段【月】部分是否可以建立唯一索引
unique_for_year   -> 数据库中字段【年】部分是否可以建立唯一索引
auto_now_add   -> 创建时,自动生成时间
auto_now   -> 更新时,自动更新为当前时间 choices  
django admin中显示下拉框,避免连表查询(连表查询效率低)
blank   -> django admin是否可以为空
verbose_name    -> django admin显示字段中文
error_messages    -> django admin 错误信息(欠)
validators   -> django form 自定义错误信息(欠)

ForeignKey

ForeignKey(to, on_delete, related_name=None, related_query_name=None,
                 limit_choices_to=None, parent_link=False, to_field=None,
                 db_constraint=True, **kwargs)

外键ForeignKey的参数

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

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

related_name : 用于反向操作时,代替表名_set,即 related_name == 表名_set。

to_field :  表示需要关联的表的字段,  默认情况下会关联表的主键。

related_query_name : 用于反向操作时,代替表名   即 表名_set ==  related_query_name_set。也可用于连表查询。

db_constraint : 表示是否在数据库中创建外建约束。

limit_choices_to: 在Admin或ModelForm中显示关联数据时,提供的条件。

parent_link: 在Admin中是否显示关联数据。(不常用)

OneToOneField

OneToOneField(to, on_delete, related_name=None, related_query_name=None,
                 limit_choices_to=None, parent_link=False, to_field=None,
                 db_constraint=True, **kwargs)

一对一外键关联字段参数

to : 要关联的表名。

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

related_name : 用于反向操作时,代替表名_set,即 related_name == 表名_set。

to_field :  表示需要关联的表的字段,  默认情况下会关联表的主键。

related_query_name : 用于反向操作时,代替表名   即 表名_set ==  related_query_name_set。也可用于连表查询

db_constraint : 表示是否在数据库中创建外建约束。

limit_choices_to: 在Admin或ModelForm中显示关联数据时,提供的条件。

parent_link: 在Admin中是否显示关联数据。(不常用)

ManyToManyField

ManyToManyField(to, related_name=None, related_query_name=None,
                 limit_choices_to=None, symmetrical=None, through=None,
                 through_fields=None, db_constraint=True, db_table=None,
                 swappable=True, **kwargs)

参数及注意事项

注意:在多对多关系中,django默认会创建第三个表,来存储对应表的关系。你也可以通过through来指定存放映射关系的表。

symmetrical: 仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True。

through:手动指定中间关联表。(需要在models.py中创建一个Model,并且其中包含两个相关联模型的外键)

through_fields:在中间表中,有多个关联对象的外建。django需要知道使用哪两个关联,through_fields = (field1,field2),注意field1应该是有ManyToManyField字段的关联模型外键名。

db_constraint:是否在数据库中创建外建约束

db_table:指定表名

代码首先创建表

from django.db import models
 
# Create your models here.
 
 
class UserInfo(models.Model):
    username = models.CharField(max_length=16,unique=True,null=True)
    pwd = models.CharField(max_length=32,null=True)
    addresss = models.CharField(max_length=32,default='sdaf')
    signup_time = models.DateField(auto_now_add=True)
 
 
class OrderInfo(models.Model):
    order_time = models.DateField(auto_now_add=True)
    order_status = models.BooleanField()
    order_content = models.CharField(max_length=32)
    key = models.ForeignKey(UserInfo, on_delete=models.CASCADE, default=1, related_name='Info',related_query_name='query')
 
 
class UserSalary(models.Model):
    money = models.IntegerField()
    user = models.ManyToManyField(UserInfo, related_name='salary')
 
 
class UserAge(models.Model):
    age = models.IntegerField()
    user_age = models.OneToOneField(UserInfo,on_delete=models.CASCADE)

img

创建五张表之后来进行一对一查询、

a = UserAge.objects.get(id=1)
d = UserInfo.objects.get(id=1) # 也可以使用filter,但是注意filter查出的是QuerySet集合。
a.age
# 12
d.username
# xiao1
 
# 正向查
a.user_age.username
# 'xiao1'
 
# 反向查    注意这个和多对一和多对多不一样。一个对象只对一个对象。
d.userage.age
# 12
 
#注意反向查的时候,不需要在model名后加set

删除

# 直接删
a.delete()
# 或者
d.userage.delete()
# 两个表达式都返回值 (1, {'myapp.UserAge': 1})

增加

# 先在主表中新建一个对象(或者查找一个对象,注意这个对象不能是已关联过的)
# e = UserInfo.objects.get(id=4)
e = UserInfo.objects.create(username = 'first')
# 然后创建从表对象,将要关联的主表对象赋值给从表中的OneToOne字段。
UserAge.objects.create(age=121,user_age=e)
 

改变

# 在主表或者从表中随便修改。然后用save()保存
a.age = 122
a.save()
d.username = "zhangzhang"
d.save()
# get()出的数据不是quertset,因此不可以使用update方法。如果想要用的话,可以使用filter查

多对多和一对多

增删改查

查询
正向操作和反向操作

注意:正反向操作时,起始必须是model中一个对象,不可以是QuerySet集合。

# 正向操作(根据从表查主表中数据)
OrderInfo.objects.get(id=1).key.username
 
# 反向操作(根据主表中数据查从表中数据)
UserInfo.objects.get(id=1).Info.all() 
# 注意:由于设置了related_name , 所以上面语句中 Info ==  orderinfo_set
# 正向操作时,对于ForeignKey,由于查到的是一个对象,因此无法使用.all()方法。

’
常用的是add和create方法。

add(*objs, bulk=True, through_defaults=None) # 将指定的模型对象添加到关联对象集合中。

a = OrderInfo.objects.get(id=2)
UserInfo.objects.get(id=3).Info.add(a)  # related_name为Info
add中可以是多个对象,也可以是关联对象主键值
# 多个对象
lists = OrderInfo.objects.filter(order_status=0)
UserInfo.objects.get(id=4).Info.add(*lists)
 
create(through_defaults=None, **kwargs)

创建一个新对象,保存并将其放入相关对象集中。返回新创建的对象.
 # 一般都是从主表出发,
UserInfo.objects.get(id=3).Info.create(order_status=1,order_content="success")
#也就相当于
u = UserInfo.objects.get(id=3)
o = OrderInfo(order_status=1,order_content="success",key=u)
o.save()

删除

remove(*objs, bulk=True)

从相关对象集中删除指定的模型对象:(这也是从主表出发)

b = Blog.objects.get(id=1) #主表对象
e = Entry.objects.get(id=234) # 从表对象
b.entry_set.remove(e) # Disassociates Entry e from Blog b.
#注意,对于ForeignKey,必须要外建字段选项null=True,才可以使用remove方法,否则不行。ManyToMany无所谓

 # 除此以外,删除操作后,只是把存放映射关系的第三张表的中的数据删除了。并没有删除从表中的数据。

clear(bulk=True)

#注意,对于ForeignKey,必须要外建字段选项null=True,才可以使用clear方法,否则不行。ManyToMany无所谓
b = Blog.objects.get(id=1)
b.entry_set.clear()

set()方法

set(objs, bulk=True, clear=False, through_defaults=None)

重置关联关系。

该方法有一个clear 参数。如果clear=False ,则将不再objes 中的元素使用remove()方法移除。如果clear=True,则首先调用clear()方法将之前的元素全部删除掉,再将集合中的元素整个删除。

posted @   文质彬彬赵其辉  阅读(112)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示