模型类补充
有如下几张表
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}

浙公网安备 33010602011771号