Model模型(上)

一、什么是Model模型?

   Model (模型) 简而言之即数据模型。模型不是数据本身(比如数据库里的数据),而是抽象的描述数据的构成和逻辑关系。每个Django model实际上是个类,继承了models.Model。每个Model应该包括属性,关系(比如单对单,单对多和多对多)和方法。当你定义好Model模型后,Django的接口会自动帮你在数据库生成相应的数据表(table)。

二、Django Model中字段(Field)的可选项和必选项(字段与选项,必选项为加粗)

1、CharField() 字符字段

  • max_length = xxx or None
  • 如不是必填项,可设置blank = True和default = ‘‘
  • 如果用于username, 想使其唯一,可以设置unique = True
  • 如果有choice选项,可以设置 choices = XXX_CHOICES

2、TextField() 文本字段

  • max_length = xxx
  • 如不是必填项,可设置blank = True和default = ‘‘

3、DateField() and DateTimeField() 日期与时间字段

  • 一般建议设置默认日期default date.
  • For DateField: default=date.today - 先要from datetime import date
  • For DateTimeField: default=timezone.now - 先要from django.utils import timezone
  • 对于上一次修改日期(last_modified date),可以设置: auto_now=True

4、EmailField() 邮件字段

  • 如不是必填项,可设置blank = True和default = ‘‘
  • 一般Email用于用户名应该是唯一的,建议设置unique = True

5、IntegerField(), SlugField(), URLField(),BooleanField()

  • 可以设置blank = True or null = True
  • 对于BooleanField一般建议设置defautl = True or False

6、FileField(upload_to=None, max_length=100) - 文件字段

  • upload_to = "/some folder/"
  • max_length = xxxx

7、ImageField(upload_to=None, height_field=None, width_field=None, max_length=100,)

  • upload_to = "/some folder/"
  • 其他选项是可选的.

8、ForeignKey(toon_delete, **options) - 单对多关系

  • to必需指向其他模型,比如 Book or ‘self‘ .
  • 必需指定on_delete options(删除选项): i.e, "on_delete = models.CASCADE" or "on_delete = models.SET_NULL" .
  • 可以设置"default = xxx" or "null = True" .
  • 如果有必要,可以设置 "limit_choices_to = ",如下面例子。
  • staff_member = models.ForeignKey( User, on_delete=models.CASCADE, limit_choices_to={‘is_staff‘: True}, )
  • 可以设置 "related_name = xxx" 便于反向查询。

9、ManyToManyField(to, **options) - 多对多关系

  • to 必需指向其他模型,比如 User or ‘self‘ .
  • 设置 "symmetrical = False " if 多对多关系不是对称的
  • 设置 "through = ‘intermediary model‘ " 如果需要建立中间模型来搜集更多信息
  • 可以设置 "related_name = xxx" 便于反向查询。

三、常见的Django Model META类选项

models.py

from django.db import models

# Create your models here.

class Meta:
    # 按Priority降序, order_date升序排列.
    get_latest_by = [‘-priority‘, ‘order_date‘]
    # 自定义数据库里表格的名字
    db_table = ‘music_album‘
    # 按什么排序
    ordering = [‘pub_date‘]
    # 定义APP的标签
    app_label = ‘myapp‘
    # 声明此类是否为抽象
    abstract = True
    # 添加授权
    permissions = (("can_deliver_pizzas", "Can deliver pizzas"),)

四、举例

1、出版社有名字和地址。书有名字,描述和添加日期。利用ForeignKey定义出版社与书单对多的关系,因为一个出版社可以出版很多书。

from django.db import models

# Create your models here.

class Publisher(models.Model):
    name = models.CharField(max_length=30)
    address = models.CharField(max_length=60)

    def __str__(self):
        return self.name

class Book(models.Model):
    name = models.CharField(max_length=30)
    description = models.TextField(blank=True, default=‘‘)
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
    add_date = models.DateField()

    def __str__(self):
        return self.name

定义Django模型Model的时候注意:

  • 这个Field是否有必选项, 比如CharField的max_length和ForeignKey的on_delete选项是必须要设置的。
  • 这个Field是否必需(blank = True or False),是否可以为空 (null = True or False)。这关系到数据的完整性。

注:TextField(blank = True, null = True)。blank = True 意味这个字段不是必需的,在客户端不是必填选项。null = True意味这个数据库里这个字段可以存储为null空值。但是Django对于空白的CharField和TextField永远不会存为null空值,而是存储空白字符串‘‘,所以正确的做法是设置default=‘‘。

2、(复杂)假设要开发一个餐厅(restaurant)的在线点评网站,允许用户(user)上传菜肴(dish)的图片并点评餐厅,就可以设计如下模型。用户与餐厅,餐厅与菜肴,及用户与菜肴都是单对多的关系。可以这样理解:一个用户可以访问点评多个餐厅,一个餐厅有多个菜肴,一个用户可以上传多个菜肴的图片。

from django.db import models
from django.contrib.auth.models import User
from datetime import date

# Create your models here.

class Restaurant(models.Model):
    name = models.TextField()
    address = models.TextField(blank=True, default=‘‘)
    telephone = models.TextField(blank=True, default=‘‘)
    url = models.URLField(blank=True, null=True)
    user = models.ForeignKey(User, default=1, on_delete=models.CASCADE)
    date = models.DateField(default=date.today)

    def __str__(self):
        return self.name

class Dish(models.Model):
    name = models.TextField()
    description = models.TextField(blank=True, default=‘‘)
    price = models.DecimalField(‘USD amount‘, max_digits=8, decimal_places=2, blank=True, null=True)
    user = models.ForeignKey(User, default=1, on_delete=models.CASCADE)
    date = models.DateField(default=date.today)
    image = models.ImageField(upload_to="myrestaurants", blank=True, null=True)
    # Related name "dishes" allows you to use restaurant.dishes.all to access all dishes objects
    # instead of using restaurant.dish_set.all
    restaurant = models.ForeignKey(Restaurant, null=True, related_name=‘dishes‘, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

# This Abstract Review can be used to create RestaurantReview and DishReview

class Review(models.Model):
    RATING_CHOICES = ((1, ‘one‘), (2, ‘two‘), (3, ‘three‘), (4, ‘four‘), (5, ‘five‘))
    rating = models.PositiveSmallIntegerField(‘Rating‘, blank=False, default=3, choices=RATING_CHOICES)
    comment = models.TextField(blank=True, null=True)
    user = models.ForeignKey(User, default=1, on_delete=models.CASCADE)
    date = models.DateField(default=date.today)

    class Meta:
        abstract = True

class RestaurantReview(Review):
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)

    def __str__(self):
        return "{} review".format(self.restaurant.name)

注:(1) Dish模型里有一个restaurant的字段,建立了一个单对多的关系。可以通过dish.restaurant.name直接查询到菜肴所属的餐厅的名字。然而Restaurant模型里并没有dish的字段,如何根据restaurant查询到某个餐厅的所有菜肴呢?Django非常聪明,可以通过在dish小写后面加上‘_set‘进行反向查询。本来可以直接通过restaurant.dish_set.all的方法来进行查找的,然而这个方法并不直观。为了解决这个问题,在dish模型里设置‘related_name = dishes", 这样就可以直接通过restaurant.dishes.all来反向查询所有菜肴了。注意一但设置了related name, 将不能再通过_set方法来反向查询。

restaurant = models.ForeignKey(Restaurant, related_name=‘dishes‘, on_delete=models.CASCADE)

(2) 需要关注的是Review模型里,设置了META选项: Abstract = True。这样一来Django就会认为这个模型是抽象类,而不会在数据库里创建review的数据表。实际上Model自带的META选项还有很多,都非常有用。

原文地址:https://www.cnblogs.com/bijian/p/9648450.html

时间: 2024-08-02 00:33:32

Model模型(上)的相关文章

tp框架-----Model模型层

1.Model模型层是用来做什么的呢? 主要是用来做操作数据库访问的.也就说明TP框架自带了一种访问数据库的方式,使用的是Model模型. 2.Model模型怎样使用呢? 要使用Model模型层访问数据库的话,需要做配置,因为必须把数据库的一些参数配置好之后,才能连接,所以找到Config.php.    如何修改配置呢? 1)打开下图路径中的Convention.php文件 2)复制convention.php中的下图内容到Home/Conf/config.php中 3)修改配置,将自己的数据

YII model模型和登陆详解

模型是 CModel 或其子类的实例.模型用于保持数据以及与其相关的业务逻辑. 模型是单独的数据对象.它可以是数据表中的一行,或者一个用户输入的表单. 数据对象的每个字段对应模型中的一个属性.每个属性有一个标签(label), 并且可以通过一系列规则进行验证. Yii 实现了两种类型的模型:表单模型和 Active Record.二者均继承于相同的基类 CModel. 表单模型是 CFormModel 的实例.表单模型用于保持从用户的输入获取的数据. 这些数据经常被获取,使用,然后丢弃.例如,在

thinkphp数据库操作Model模型

Model是对数据库的操作 之前两章已经说了MVC中的V(view)和C(controller),这一章主要讲M(model). 一.连接数据库 首先要创造一个操作数据库 之后打开shop查看原始配置 之后我们去配置自己的数据库 这样,数据库就配置好了. 二.创建model类 原则上来讲,一个model对应一个数据表,有一个数据表就要对应一个model 控制器如何创建,model就如何创建 注意: Model要和Admin以及Home平行存放,使得既能让Home使用,又能让Admin使用 创建一

201507221403_《backbone之一——新建模型和集合、实例化模型、模型上监听事件的方法、模型设置和获取后台数据、配置理由方法、视图绑定事件的方法、绑定模型等》

一 . 新建 var model_1 = new Backbone.Model({'name':'hello'}); var model_2 = new Backbone.Model({'name':'hi'}); var models = new Backbone.Collection(); models.add( model_1 ); models.add( model_2 ); alert( JSON.stringify(models) ); 二. 实例化模型 var M = Backbo

Django基础核心技术之Model模型的介绍与设计

Django基础核心技术之Model模型的介绍与设计原创: Yunbo Shi Python Web与Django开发 2018-05-03Django网络应用开发的5项基础核心技术包括模型(Model)的设计,URL的配置,View(视图)的编写,Template(模板)的设计和Form(表单)的使用.今天小编我就拼了老命来用千字长文给你来介绍下第一项Django核心基础知识之Model的设计吧.想持续了解后续Django Web开发技术请订阅我的公众号[Python与Django大咖之路].

TP框架---Model模型层---做模型对象

TP框架----Model模型层---------------做模型对象 Model模型层是用来做什么的呢???? 主要是用来做操作数据库访问的. 也就说明TP框架自带了一种访问数据库的方式,使用的是Model模型. Model模型怎样使用呢??? 要使用Model模型层访问数据库的话,需要做配置,因为必须把数据库的一些参数配置好之后,才能连接,所以找到Config.php 配置文件,打开 这些是关于数据库的配置, 要把这些粘贴到config.php 进行修改. config.php配置文件(修

ecmall中static变量的使用-model模型代码设计

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 function &m($model_name, $params = array(), $is_new = false) {     <span style="backg

unity3d动画帧事件回调脚本必须直接挂在模型上

unity3d动画帧事件回调脚本必须直接挂在模型上,即与Animator同级,不能挂接在模型的父节点或者子节点,否则无法找到回调函数 以上在idle动作中新增帧事件skill,回调模型脚本中的skill()函数

MVC中Model BLL层Model模型互转

MVC中Model BLL层Model模型互转 一. 模型通常可以做2种:充血模型和失血模型,一般做法是模型就是模型,不具备方法来操作,只具有属性,这种叫做失血模型(可能不准确):具备对模型一定的简单操作方法,不只是有属性的模型叫做充血模型,如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace MvcApplication1.Models { /// <