模型类补充
有如下几张表
from django.db import models # Create your models here. class UserInfo(models.Model): name=models.CharField(max_length=32) pwd=models.CharField(max_length=32) type_choices=((1,"讲师"),(2,"班主任"),(3,"学生")) type=models.IntegerField(choices=type_choices) def __str__(self): return self.name class ClassList(models.Model): name=models.CharField(max_length=32) tutor=models.ForeignKey(to="UserInfo",related_name="cls_tutor",limit_choices_to={"type":2}) teacher=models.ForeignKey(to="UserInfo",related_name="cls_teacher",limit_choices_to={"type":1}) def __str__(self): return self.name class Student(models.Model): name=models.ForeignKey("UserInfo",related_name="cls_student",limit_choices_to={"type":3}) class Course(models.Model): name = models.CharField(max_length=32) cls = models.ManyToManyField(to="ClassList")
调用方法
# 模型类调用他的属性,得到的是Django封装的一个对象 ClassList.name <django.db.models.query_utils.DeferredAttribute object at 0x00000246A55013C8> # 模型类对象调用属性,得到的是存储的值 ClassList.objects.first().name 'python8期' # 使用字符串调用他的属性,得到的还不是类属性那里的对象,因为所在的路径是不同的, # 因为一般用的都是他,后面就把他叫做字段对象 ClassList._meta.get_field("name") <django.db.models.fields.CharField: name> # 通过这个对象获取他所在的类 ClassList._meta.get_field("name").model <class 'app01.models.ClassList'> # 但是使用这个对象可以取得模型类中关于这个字段的一些信息,这些大多信息都封装在rel属性里 # 获取这个字段的名字,这里没什么用,但是下面可以用到 ClassList._meta.get_field("name").name 'name' # 获取模型类中字段设置的信息 ClassList._meta.get_field("tutor").rel.related_name 'cls_tutor' ClassList._meta.get_field("tutor").rel.limit_choices_to {'type': 2} # 关联的模型类,可以通过他取得关联类的数据 ClassList._meta.get_field("tutor").rel.to <class 'app01.models.UserInfo'> # 获取所有数据 ClassList._meta.get_field("tutor").rel.to.objects.all() <QuerySet [<UserInfo: alex>, <UserInfo: xiaoyu>] # _meta的更多属性,模型类的实例对象也可以调用_meta # 模型类的名字 ClassList._meta.model_name 'classlist' # 所在app的名字 ClassList._meta.app_label 'app01' # 所有关联这个模型类的反向字段对象的集合, ClassList._meta.related_objects (<ManyToManyRel: app01.course>,) type(ClassList._meta.related_objects[0]) <class 'django.db.models.fields.reverse_related.ManyToManyRel'> UserInfo._meta.related_objects (<ManyToOneRel: app01.classlist>, <ManyToOneRel: app01.classlist>, <ManyToOneRel: app01.student>) type(UserInfo._meta.related_objects[0]) <class 'django.db.models.fields.reverse_related.ManyToOneRel'> # 这个对象不是写在模型类中的对象,是一个反向的对象,通过这个对象.field可以获得对应的字段对象 UserInfo._meta.related_objects[0].field <django.db.models.fields.related.ForeignKey: tutor> ClassList._meta.get_field("tutor") <django.db.models.fields.related.ForeignKey: tutor> # 在这里就能得到反向对象关联到UserInfo的那个字段的名字 UserInfo._meta.related_objects[0].field.name 'tutor' # 这个对象获得更多的信息 # 获取关联UserInfo的那个字段关联的UserInfo的哪个字段,就是关联UserInfo的那个字段的to的值 UserInfo._meta.related_objects[0].field_name # 多对多没有这个属性 'id' # 获取关联UserInfo的那个字段反向查询的名字,就是关联UserInfo的那个字段的related_name的值 # .name也是这个值 UserInfo._meta.related_objects[0].related_name 'cls_tutor' # 获取关联UserInfo的那个字段modelform过滤的条件,就是关联UserInfo的那个字段的limit_choices_to的值 UserInfo._meta.related_objects[0].limit_choices_to {'type': 2}