ORM - 多表实例
表与表之间得关系分为三种
- 一对一:一个人对应一个身份证号码,数据字段设置为unique。
- 一对多:一个家庭有多个人,一般通过外键实现
- 多对多:一个学生有多门课程,一个课程有多个学生,一般通过第三个表来实现关联
创建模型
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
pub_date = models.DateField()
publish = models.ForeignKey("Publish", on_delete=models.CASCADE)
authors = models.ManyToManyField("Author")
class Publish(models.Model):
name = models.CharField(max_length=32)
city = models.CharField(max_length=64)
email = models.EmailField()
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.SmallIntegerField()
au_detail = models.OneToOneField("AuthorDetail", on_delete=models.CASCADE)
class AuthorDetail(models.Model):
gender_choices = (
(0, "女"),
(1, "男"),
(2, "保密"),
)
gender = models.SmallIntegerField(choices=gender_choices)
tel = models.CharField(max_length=32)
addr = models.CharField(max_length=64)
birthday = models.DateField()
说明:
- EmailField数据类型是邮箱格式,底层继承CharField,进行了封装,相当于MySQL中的varchar。
- Django1.1版本不需要级联删除:
on_delete = models.CASCADE
,Django2.2需要。 - 一般不需要设置级联更新
- 外键在一对多的多中设置:
models.ForeignKey("关联类名", on_delete=models.CASCADE)
。 - OneToOneField = Foreig