模型类补充

有如下几张表

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}

  

  

posted @ 2018-03-24 09:09  瓜田月夜  阅读(729)  评论(0)    收藏  举报