Django操作mysql数据库(二)

模型文档地址

https://docs.djangoproject.com/en/3.0/topics/db/models/

实践是检验真理的唯一标准

上一篇文档,我们把这个模型的流程,通过pycharm走通了,那么,我们现在就可以根据官方文档,码代码了。

1、ORM设计思想
即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,可以认为,django通过models将python语言翻译成了数据库执行语句 。
例如,下面的代码1和代码2是等价的:

代码1(python):

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

代码2(sql):

CREATE TABLE myapp_person (
    "id" serial NOT NULL PRIMARY KEY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);

2、django的模型使用
上一篇文档中,我们在使用模型上遇到了一些坑,其中一个是要把应用进行注册才能使用模型。这点在官方文档也是说明了的:

Once you have defined your models, you need to tell Django you’re going to use those models. Do this by editing your settings file and changing the INSTALLED_APPS setting to add the name of the module that contains your models.py.

3、字段
Django附带了几十个内置字段类型,可以在模型字段引用中找到完整的列表。如果Django的内置字段不能实现这个功能,也可以很容易地编写自己的字段。

字段类型:https://docs.djangoproject.com/en/3.0/ref/models/fields/#model-field-types
自定义:https://docs.djangoproject.com/en/3.0/howto/custom-model-fields/

(1)字段的参数定义(这里截取上一个文档的例子):

loginname = models.CharField(max_length=20, null=False, unique=True)

在这里插入图片描述
如上,对于字段有一些通用参数:

@参数 null:
为True,将空值存储为NULL,否则不存储
@参数blank:
为True,允许输入空值;为False,则必填
@参数choices:
YEAR_IN_SCHOOL_CHOICES = [
(‘FR’, ‘Freshman’),
(‘SO’, ‘Sophomore’),
(‘JR’, ‘Junior’),
(‘SR’, ‘Senior’),
(‘GR’, ‘Graduate’),
]
用于页面上的选择框标签,models提供一个二维的二元元组,第一个元素表示存在数据库内真实的值,第二个表示页面上显示的具体内容。
@参数default:
字段的默认值。它可以是值或可调用对象。
@参数help_text:
把鼠标放到页面部件上,会显示
@参数primary_key:
如果为True,自定义该字段为模型的主键,属性为只读。 django会自动添加一个IntegerField来保存主键,即id:
id = models.AutoField(primary_key=True)
@参数unique:
如果为真,则该字段必须在整个表中唯一。
@参数primary_key:
django默认生成主键id:
id = models.AutoField(primary_key=True)
@参数verbose_name
django自动创建字段名称 verbose_name
自定义:
first_name = models.CharField(verbose_name=“person’s first name”, max_length = 30)
默认自动填写:
first_name = models.CharField( max_length = 30)
其中,ForeignKey, ManyToManyField 和OneToOneField没有该参数。而且,Django会自动将第一个字母大写(哪怕是自定义的)。

3、关系
Django提供了定义三种最常见的数据库关系类型的方法:多对一、多对多和一对一。
(1)多对一例子

class Manufacturer(models.Model):
    # ...
    pass

class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)

(2)多对多例子

class Topping(models.Model):
    # ...
    pass

class Pizza(models.Model):
    # ...
    toppings = models.ManyToManyField(Topping)

(3)一对一例子

class Place(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)

    def __str__(self):
        return "%s the place" % self.name

class Restaurant(models.Model):
    place = models.OneToOneField(
        Place,
        on_delete=models.CASCADE,
        primary_key=True,
    )
    serves_hot_dogs = models.BooleanField(default=False)
    serves_pizza = models.BooleanField(default=False)

    def __str__(self):
        return "%s the restaurant" % self.place.name

class Waiter(models.Model):
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)

    def __str__(self):
        return "%s the waiter at %s" % (self.name, self.restaurant)

猜你喜欢

转载自blog.csdn.net/weixin_43431593/article/details/106876828