django db

配置mysql

修改配置文件

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysql',
        'USER': 'root',
        'PASSWORD': 'Abc@12345678',
        'HOST': '127.0.0.1',
        'POST': 3306,

    }
}

安装mysqlclient

brew install mysql-client
echo 'export PATH="/usr/local/opt/mysql-client/bin:$PATH"' >> ~/.bash_profile
export PATH="/usr/local/opt/mysql-client/bin:$PATH"
pip install mysqlclient

定义表

models.py

from django.db import models

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

创建表

python manage.py makemigrations mysite
python manage.py migrate mysite

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CAdzt5ho-1597559662551)(/Users/admin/Library/Application Support/typora-user-images/image-20200730112150749.png)]

字段类型

AutoField

自增主键

BigAutoField

自增主键,64位整型,从19223372036854775807.

BigIntegerField

64位整型, 从-92233720368547758089223372036854775807

BooleanField

布尔类型,True或者False

CharField

字符串类型

class CharField(max_length=None, options)**

DateField

日期类型,对应python的datetime.date类型

class DateField(auto_now=False, auto_now_add=False**,** options)**[

  • DateField.auto_now 内容每次更新时都会自动更新该字段
  • DateField.auto_now_add 内容创建时自动更新该字段

DateTimeField

对应python的datetime.datetimel类型和DateFile接收相同的参数

DecimalField

固定精度的10进制数字,对应python中的Decimal类型

字段选项

null

如果设置为 True,当该字段为空时,Django 会将数据库中该字段设置为 NULL。默认为 False

blank

如果设置为 True,该字段允许为空。默认为 False

注意该选项与null 不同, null选项仅仅是数据库层面的设置,然而 blank 是涉及表单验证方面。如果一个字段设置为 blank=True,在进行表单验证时,接收的数据该字段值允许为空,而设置为blank=False时,不允许为空。

choices

一系列二元组,用作此字段的选项。如果提供了二元组,默认表单小部件是一个选择框,而不是标准文本字段,并将限制给出的选项。

一个选项列表:

YEAR_IN_SCHOOL_CHOICES = [
    ('FR', 'Freshman'),
    ('SO', 'Sophomore'),
    ('JR', 'Junior'),
    ('SR', 'Senior'),
    ('GR', 'Graduate'),
]

每个二元组的第一个值会储存在数据库中,而第二个值将只会用于在表单中显示。

对于一个模型实例,要获取该字段二元组中相对应的第二个值,使用 get_FOO_display() 方法。例如:

from django.db import models

class Person(models.Model):
    SHIRT_SIZES = (
        ('S', 'Small'),
        ('M', 'Medium'),
        ('L', 'Large'),
    )
    name = models.CharField(max_length=60)
    shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'

你也可以使用枚举类以简洁的方式来定义 choices

from django.db import models

class Runner(models.Model):
    MedalType = models.TextChoices('MedalType', 'GOLD SILVER BRONZE')
    name = models.CharField(max_length=60)
    medal = models.CharField(blank=True, choices=MedalType.choices, max_length=10)

default

该字段的默认值。可以是一个值或者是个可调用的对象,如果是个可调用对象,每次实例化模型时都会调用该对象。

help_text

额外的“帮助”文本,随表单控件一同显示。即便你的字段未用于表单,它对于生成文档也是很有用的。

primary_key

如果设置为 True ,将该字段设置为该模型的主键。

在一个模型中,如果你没有对任何一个字段设置 primary_key=True 选项。 Django 会自动添加一个 IntegerField 字段,并设置为主键,因此除非你想重写 Django 默认的主键设置行为,你可以不手动设置主键。

主键字段是只可读的,如果你修改一个模型实例的主键并保存,这等同于创建了一个新的模型实例。例如:

from django.db import models

class Fruit(models.Model):
    name = models.CharField(max_length=100, primary_key=True)
>>> fruit = Fruit.objects.create(name='Apple')
>>> fruit.name = 'Pear'
>>> fruit.save()
>>> Fruit.objects.values_list('name', flat=True)
<QuerySet ['Apple', 'Pear']>

自动设置主键

默认情况下, Django 会给每一个模型添加下面的字段:

id = models.AutoField(primary_key=True)

unique

如果设置为 True,这个字段的值必须在整个表中保持唯一

vervbose_name

除了 ForeignKeyManyToManyFieldOneToOneField,任何字段类型都接收一个可选的位置参数 `verbose_name如果未指定该参数值, Django 会自动使用字段的属性名作为该参数值,并且把下划线转换为空格。

在该例中:备注名为 "person's first name":

first_name = models.CharField("person's first name", max_length=30)

在该例中:备注名为 "first name":

first_name = models.CharField(max_length=30)

ForeignKeyManyToManyFieldOneToOneField接收的第一个参数为模型的类名,后面可以添加一个 verbose_name参数:

poll = models.ForeignKey(
    Poll,
    on_delete=models.CASCADE,
    verbose_name="the related poll",
)
sites = models.ManyToManyField(Site, verbose_name="list of sites")
place = models.OneToOneField(
    Place,
    on_delete=models.CASCADE,
    verbose_name="related place",
)

惯例是不将 verbose_name的首字母大写,必要时 Djanog 会自动把首字母转换为大写。

db_column

指定列名,覆盖默认名称

db_index

如果设置为True,则数据库为该字段创建索引

unique

如果设置为 True,这个字段必须在整个表中保持值唯一。

关联关系

多对一关联

定义一个多对一的关联关系,使用 django.db.models.ForeignKey 类。就和其它 Field字段类型一样,只需要在你模型中添加一个值为该类的属性。

ForeignKey类需要添加一个位置参数,即你想要关联的模型类名。

例如,如果一个 Car 模型有一个制造者 Manufacturer --就是说一个 Manufacturer 制造许多辆车,但是每辆车都仅有一个制造者-- 那么使用下面的方法定义这个关系:

from django.db import models

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

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

多对多关联

定义一个多对多的关联关系,使用 django.db.models.ManyToManyField类。就和其他 Field字段类型一样,只需要在你模型中添加一个值为该类的属性。

ManyToManyField类需要添加一个位置参数,即你想要关联的模型类名。

例如:如果 Pizza 含有多种 Topping (配料) – 也就是一种 Topping 可能存在于多个 Pizza 中,并且每个 Pizza 含有多种 Topping --那么可以这样表示这种关系:

from django.db import models

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

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

和 `ForeignKey类一样,你也可以创建 自关联关系(一个对象与他本身有着多对多的关系)和 与未定义的模型的关系。

建议设置 ManyToManyField 字段名(上例中的 toppings )为一个复数名词,表示所要光联的模型对象的集合。

对于多对多光联关系的两个模型,可以在任何一个模型中添加 ManyToManyField字段,但只能选择一个模型设置该字段,即不能同时在两模型中添加该字段。

一般来讲,应该把 ManyToManyField实例放到需要在表单中被编辑的对象中。在之前的例子中, toppings 被放在 Pizza 当中(而不是 Topping 中有指向 pizzasManyToManyField因为相较于配料被放在不同的披萨当中,披萨当中有很多种配料更加符合常理。按照先前说的,在编辑 Pizza 的表单时用户可以选择多种配料。

一对一关联

Meta选项

abstract: abstract类型

db_table:表名

get_latest_by:在model中指定一个DateField或者DateTimeField。这个设置让你在使用model的Manager上的lastest方法时,默认使用指定字段来排序

ordering:对象返回的记录结果集是按照哪个字段排序的。这是一个字符串的元组或列表,没有一个字符串都是一个字段和用一个可选的表明降序的’-‘构成。当字段名前面没有’-‘时,将默认使用升序排列。使用’?’将会随机排列

indexes:在表中定义的索引列表

unique_together:多个字段同时唯一

index_together:联合索引

constraints:约束

verbose_name:人类可读的名称

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值