多对多关系的创建,orm字段参数
多对多关系的三种创建方式
# 1. 全自动的
图书表 作者表 -----》 多对多
# 第三张表
# 1. 全自动的
# class Book(models.Model):
# title = models.CharField(max_length=32)
# authors = models.ManyToManyField(to='Author')
#
#
# class Author(models.Model):
# name = models.CharField(max_length=64)
# 2. 我们自己来创建第三张表:纯手动
# class Book(models.Model):
# title = models.CharField(max_length=32)
#
#
#
# class Author(models.Model):
# name = models.CharField(max_length=64)
#
# # 极大的好处:扩展性高了
# class Book2Author(models.Model):
# book = models.ForeignKey(to='Book', on_delete=models.CASCADE)
# author = models.ForeignKey(to='Author', on_delete=models.CASCADE)
# bind_time = models.DateTimeField(auto_now_add=True)
# 第三种方式:半自动化
class Book(models.Model):
title = models.CharField(max_length=32)
# authors = models.ManyToManyField(to='Author',
# through='Book2Author',
# through_fields=('book', 'author')
# )
"""
注意:
1. 还是需要一个虚拟字段authors----->models.ManyToManyField
2. through:指定第三张表的表名
3. through_fields:指定第三张表里面哪两个字段是关系字段
4. through_fields=('author', 'book')里面的两个字段是有顺序要求的
5. 这种方式是可以支持正反向查询的,但是不能使用那4个方法了,add remove set clear
"""
class Author(models.Model):
name = models.CharField(max_length=64)
books = models.ManyToManyField(to='Book',
through='Book2Author',
through_fields=('author', 'book')
)
# 极大的好处:扩展性高了
class Book2Author(models.Model):
book = models.ForeignKey(to='Book', on_delete=models.CASCADE)
author = models.ForeignKey(to='Author', on_delete=models.CASCADE)
bind_time = models.DateTimeField(auto_now_add=True)
常见字段和参数
# AutoField
int自增列,必须填入参数 primary_key=True。
# IntegerField
一个整数类型,范围在 -2147483648 to 2147483647。
# CharField
# DateField
# DateTimeField
auto_now=True
auto_now_add=True
# BooleanField(Field)
- 布尔值类型
# 在代码里面就是要True/False-------------->在数据库中存的是0/1
# TextField(Field)
- 文本类型------------>可以存大段的文本------------->当字符串比较少的时候,一般用varchar(512)
----------》text----->存一篇文章
# FileField(Field) ------------> 可以上传文件
- 字符串,路径保存在数据库,文件上传到指定目录
- 参数:
upload_to = "" 上传文件的保存路径
# image = models.FileField(upload_to='文件上传的位置')
image = models.ImageField(upload_to='图片') # 只能上传图片
# FloatField(Field)
- 浮点型
# DecimalField(Field)
- 10进制小数
- 参数:
max_digits,小数总长度
decimal_places,小数位长度
ORM参数
#### null
用于表示某个字段可以为空。
# max_length
# verbose_name
# default----->指定默认值
# unique=True
# db_index=True 加索引
自定义字段
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)
本文作者:xiaolisolove
本文链接:https://www.cnblogs.com/zxjwt/p/17362572.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步