django模型类的理解

django通过在子应用的models.py中添加模型类来操作数据库,从而代替了sql语句。

生成表

注册

在models中写完模型类后,要在设置文件的INSTALLED_APPS中添加子应用名称来完成注册

数据迁移

在manage.py文件同名目录下运行:

python manage makemigrations

在进行模型类迁移的子应用下的migrations文件里会生成0001_initial文件,当迁移失败时,可以删除此文件,然后重新走这个命令

python manage migrate

此语句将模型类变成数据库里的table

模型类的编写与使用

class User(AbstractUser):
    mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号')
    default_address = models.ForeignKey('Address',
                                        related_name='users',
                                        null=True,
                                        blank=True,
                                        on_delete=models.SET_NULL,
                                        verbose_name='默认地址')
    # 对当前表进行相关设置:
    class Meta:
        db_table = 'tb_users'
        verbose_name = '用户'

    def __str__(self):
        return self.username

写模型类

1、此中继承了自AbstractUser,这个父类本身已经包含了很多字段,如username、email等,此中重新此类加上了两个字段。
2、class Meta负责整个表的布置问题,如db_table给表命名,或者ordering=[’-id’]将表按照id倒序。
3、最后的__str__魔法方法,为了在打印台打印方便调试而已。
4、这里的default_address是外键,第一个参数(子应用名.模型类名)是关联的模型类,切记要用 ‘’ 将类名引起来,这里因为Address和User同在一个子应用里,所以直接写模型类名。当字段是外键是,还可以传入参数related_name=’'设置反外键,此中写related_name=‘users’,表示Address可以通过users来找到default_address,从而达到一对多的效果,因为django里设置外键默认对应的就是另一个表里的id,而id是不重复的,default_address是可以重复的,所以充其量只能达到多对一的效果,而设置related_name可以让链子反过来,从而达到一对多。

操作模型类

django内置了很多模型类操作的函数,基本用法是类名.objects.函数,此中依然以上面的User类举例,函数以我用的多的filter和get举例
1、User.objects.filter(mobile=mobile_enter),筛选出所有mobile是mobile_enter的结果,结果是一个QuerySet对象,类似于一个列表,每个元素对应数据库里的一行数据,在控制台打印出来就是
, ]>
filter筛选出多少项,结果就是打印出多少个 User : Address object, 一个这个对应的就是数据库里的一行,这每一个就相当于一个字典,若这个表格有索引,可以用User.objects.filter(mobile=mobile_enter)[0].id打印出第一个的id值。
2、User.objects.get(mobile=mobile_enter),只能返回一个,如果没有返回值或者返回值大于一个,会直接崩掉,因此多写在try中,返回值打印出来直接就是
User object
相当于filter的一项,所以可以直接调用table里的字段并且拿到返回值,如User.objects.get(mobile=mobile_enter).id。
3、request.user,这是一种固定的形式,用于拿到当前登录的用户的信息,本质和get一样,就是拿到了table里的一行,所以可以直接用request.user.id拿到当前登录的用户的id。
4、外键的用法:request.user.default_address就相当于拿到了Address里的一行,打印出来也是User object,可以直接调用Address里的字段,如果只是单纯的想得到default_address的值,必须要用request.user.default_address_id,因为当一个字段被当做外键时,他的名称会自动在后面加上’_id’。

以上仅是个人理解!!!

你可能感兴趣的:(进击的小白)