多对多关系的创建,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 中国大陆许可协议进行许可。

posted @   xiaolisolove  阅读(9)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.