什么是模型
一般来说每个模型映射每一个数据表
每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
定义模型
from django.db import models
class Person(models.Model):
#使用CharField方法则会采用限定最大值
first_name = models.CharField(max_length=30)
#执行makemigrate migrates这样会生成yourapp_person的表名
使用模型
INSTALLED_APPS = [
#我们使用的模型需要在setting.py里面进行声明
'person',
#...
]
当你向 INSTALLED_APPS 添加新的应用的时候,请务必运行 manage.py migrate,此外你也可以先使用以下命令进行迁移 manage.py makemigrations。
定义字段
from django.db import models
class Parent(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
class Album(models.Model):
#定义外键
parent = models.ForeignKey(Parent,on_delete=models.CASECADE)
字段选项
class Person(models.Modle)
SHIT_CHOICE = (
('S','Small'),
('M','Middle'),
('L','Large'),
)
shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
p = Person(shit_choice="L")
p.save()
p.shit_choice #打印出Large
p.get_shirt_size_display() 'Large'
verbose_name作为备注
关联关系
多对一关联,就是在多的一方使用指定外键(ForeignKey)
from django.db import models
class Manufacturer(models.Model):
# ...
pass
class Car(models.Model):
外键设置on_delete是为了是否级联删除
manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
# ...
#模型本身的自关联 --最典型的就是地区
class Area(models.Model):
name = models.CharField(max_length=20, verbose_name='名称')
# 自关联(特殊的一对多): 生成的字段名 parent_id
parent = models.ForeignKey('self', verbose_name='上级行政区划')
class Meta:
db_table = 'tb_areas'
verbose_name = '行政区划'
那么,怎么查询呢?
如果知道一个市,叫a市,想查他属于什么省。
a = Area.objects.get(id=1)
b就是a市的省份的对象
b = a.parent
如果知道一个省,叫a省,想查他有什么市。
a = Area.object.get(id=1)
b就是a省的全部市的对象
b = a.area_set.all() #类名小写+’_set’
多对多关联的两种方式
传统的方式:自己手动关联
class Student(models.Model):
name= models.CharField(max_length=16)
birthday=models.DateField()
class Club(models.Model):
name= models.CharField(max_length=16)
class Membership(models.Model):
student = models.ForeignKey("Student")
club = models.ForeignKey("Club")
Django自带方式
class Student(models.Model):
2 name= models.CharField(max_length=16)
3 birthday=models.DateField()
4 class Club(models.Model):
5 name= models.CharField(max_length=16)
6 members = models.ManyToManyField("Student")
Django的一对一模式
from django.db import models
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
def __str__(self):
return "%s the place" % self.name
class Restaurant(models.Model):
place = models.OneToOneField(
Place,
on_delete=models.CASCADE,
primary_key=True,
)
serves_hot_dogs = models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False)
def __str__(self):
return "%s the restaurant" % self.place.name