Django模型解读

什么是模型
一般来说每个模型映射每一个数据表

每个模型都是一个 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值