美文网首页
关于django查询model数据的记录

关于django查询model数据的记录

作者: LinearPi | 来源:发表于2018-08-02 18:05 被阅读0次
  1. Pycharm 2017.3.3
  2. Django 1.11.6
  3. Python 3.5.2

一. 建立model类型

# 从 Django 中引入 models
from django.db import models

# Create your models here.
 见下面的实例 
这是实例会涉及到多对多, 一对多. 一对一

创建数据库 makemigrations app 和 migrate app

1.字段参数
下面列举一下目前笔者在开发中用到的一些字段:

max_length:指定字段的长度值,接受一个数字,CharField 必须指定最大长度, TextField 不需要。
verbose_name:字段标签的可读名称,接受一个字符串。如果不指定,Django 会从字段名称去推断默认的详细名称,建议每一个字段都进行指定。
default:字段默认值。
null:是否可以为 null,接受 True 或者 False。
blank: 是否可以为空,同样接受 True 或者 False。
primary_key:如果设置为 Ture,则该字段置为模型主键,如果模型中没有指定主键,则 Django 会自动为模型添加一个主键,默认为 id。
help_text:为 HTML 表单文本提供单文本标签。
choices:一组字段选项,提供这一项的时候,默认对应的表单不见是选择字段的盒子,而不是标准文本字段。
2.字段类型
CharField:用来定义短到中等长度的字段字符串,必须指定 max_length 属性。
TextField:用于大型的任意长度字符串,不强制要求指定 max_length 属性,  仅仅当该字段以表单显示才会使用,不会在数据库级别进行强制执行。
IntegerField:用于存储整形数据,在用于表单中验证输入的值需要时整数。
FloatField:用于存储浮点型数据
DateField 和 DateTimeField:用于存储/表示日期和日期/时间信息(分别是Python.datetime.date和datetime.datetime对象。
这些字段可以另外表明(互斥)参数
 auto_now=Ture (在每次保存模型时将该字段设置为当前日期),
 auto_now_add(仅设置模型首次创建时的日期)
 default(设置默认日期,可以被用户覆盖)。一般笔者选择的默认日期是 datetime.now。需要引用datetime模块
EmailField:用来存储和验证电子邮件地址。
FileField:用于上传文件,需要提供 upload_to 指定上传到的地方。
ImageField:和上传文件表现基本相似,会额外进行是否为图像的验证。
AutoField:是一种 IntegerField 自增的特殊类型,如果模型没有指定主键的话,此类型的主键将自动添加到模型中。
ForeignKey:外键,用于指定与另一个数据库模型的一对多关系。关系 “一” 侧是包含密钥的模型。和 flask 指定外键的方式不同。
ManyToManyField:用于指定多对多关系,例如,一本书可以有几种类型,每种类型可以包含几本书)。
在我们的图书馆应用程序中,我们将非常类似地使用它们ForeignKeys,但是可以用更复杂的方式来描述组之间的关系。
这些具有参数on_delete来定义关联记录被删除时会发生什么(例如,值models.SET_NULL将简单地设置为值NULL)。笔者用的不是很多。



通过声明 class Meta 来声明模型级别的元数据
一个模型也可以有方法,最基本的使用就是定义一个标准的 Python 类方法: __str__:

# 完整的 model
class Department(models.Model):
    d_id = models.AutoField(primary_key=True)
    d_name = models.CharField(max_length=30)
    
    class Meta:
        verbose_name = u"部门"
        verbose_name_plural = verbose_name
        
    def __str__(self):
        return 'Department<d_id=%s,d_name=%s>'%(
            self.d_id,self.d_name
        )


class Student(models.Model):
    s_id = models.AutoField(primary_key=True)
    s_name = models.CharField(max_length=30)
    department = models.ForeignKey('Department')
    course = models.ManyToManyField('Course')
    
    def __str__(self):
        return 'Student<s_id=%s,s_name=%s>'%(
            self.s_id,self.s_name
        )


class Course(models.Model):
    c_id = models.AutoField(primary_key=True)
    c_name = models.CharField(max_length=30)
    
    def __str__(self):
        return 'Course<c_id=%s,c_name=%s>'%(
            self.c_id,self.c_name
        )


class Stu_detail(models.Model):
    s_id = models.OneToOneField('Student')
    age = models.IntegerField()
    gender = models.BooleanField(default=1)
    country = models.CharField(max_length=30,null=True)
    
    def __str__(self):
        return 'Stu_detail<s_id=%s,age=%s,gender=%s,country=%s>'%(
            self.s_id,self.age,self.gender,self.country)

存数据 可以利用实例化时候存取数据 对应相应的字段,然后保存.

from django.shortcuts import render  # 引入 render 方法
from .models import Department,  Student, Course,  Stu_detail    # 引入之前配置好的 Model
 ......

读取数据..

# {BASE_DIR/apps/message/views.py}
from django.shortcuts import render
from school.models import Department, Student, Course, Stu_detail


# Create your views here.


class Index(View):
    def get(self, request):
         # 在只有两级的查询,如Student,Department之间的查询
        # Department查询Student的信息
      students = Student.objects.all()filter(d_id=int(department的id))
         # Student查询Department的信息
      department= Department.objects.all()filter(d_id=int(department的id))
        
        pass
            

相关文章

网友评论

      本文标题:关于django查询model数据的记录

      本文链接:https://www.haomeiwen.com/subject/fonnrftx.html