Django数据库设置及相关操作

1 ForeignKey 反向查询

  使用 Django 创建模型的时候一定会经常使用外键来创建两个表格之间多对一的外键关系,例如B中有一个 models.ForeignKey(A) 。而当我们需要反向查询 A 中某个具体实例所关联的 B 时,可能会用到以下两种方法:

  • A.B_set.all()
  • B.objects.filter(A)

2 model相关API

  相关实例的方法,可以参考官方的官方文档。

2.1 Model.get_FOO_display()

  对于每一个具有choices的数据字段,都会有一个get_foo_display()方法,其中foo代表了该数据库字段的名称。该函数返回数据库字段的值,可以使用的方式如下:

def __str__(self):
    return '{0} - {1} - {2}'.format(self.name, self.get_category_type_display(),                    self.get_category_level_display())
2.2 Model.save()

  model在创建实例后,不会接触到数据库,需要调用save()方法来进行数据更改存储。同时,我们可以通过重写改方法来自行定制数据存储方式,如下:

def save(self, *args, **kwargs):
    if not self.en_name:
        self.en_name = self.name
    if not self.en_desc:
        self.en_desc = self.desc
    super(MaterialCategory, self).save(*args, **kwargs)

3 Model字段类型

官方参考资料

3.1 通用数据库字段参数

  关于数据库model的介绍可以查看官网文档

3.1.1 choices字段

  该参数接收一个可迭代的列表或元组(基本单位为二元组)。如果指定了该参数,在实例化该模型时,该字段只能取选项列表中的值。每个二元组的第一个值会储存在数据库中,而第二个值将只会用于显示作用。
  对于一个模型实例,要获取该字段二元组中相对应的第二个值,使用 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)
3.1.2 verbose_name字段

  设置备注名

3.2 FileField

  一个提供数据上传的字段。

不能将该字段设置为主键,否则会报错。

class FileField(upload_to=None, max_length=100, **options)
  参数类型:

  • FileField.upload_to:这个属性提供了两种设置上传路径的方式,值将会进一步传递Storage.save()方法里。第二种方式可以传入strftime() 格式的路径地址,在保存时会直接保存在时间格式的文件夹下:
  • Field.null:默认为False,如果设置为True,django将会把一个空值在字符串中存储为null。
  • Field.blank:默认为Flase,表示这个字段是required,如果设置为True,则这个字段可以设置为空白。

区别与null,null关系到数据库,而blank关系到数据库验证。
注意如果设置了null为ture,那个需要同时将blank设置为true。

3.3 ImageField

  这个属性继承了FileField的全部属性,只不过他需要做存储的必须是图片的验证。

class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)

3.4 ForeignKey

  设置一个多对一关系,即外键。
class ForeignKey(to, on_delete, **options)
  这个类有两个必须的参数。一个是to,指定多对一的关系,同时这个to也可以指向他自己(设置为’self’)。第二个参数为on_delete,这个参数在django2.0以后是必须的。

from django.db import models

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

class Manufacturer(models.Model):
    # ...
    pass
3.4.1 related_name字段

  用在ForeignKey上,related_name 可以给这个外键定义好一个别的名称,作为关联对象的反向引用描述符。同时可以将该字段设置为"+"或者以“+”结束,来表示该模型不具有向后关系。

  django 默认每个主表的对象都有一个是外键的属性,可以通过它来查询到所有属于主表的子表的信息。这个属性的名称默认是以子表的名称小写加上_set()来表示(上面默认以b_set访问),默认返回的是一个querydict对象。可以使用relatd_name来显性声明。

4 元数据(Meta Option)

参考于博主教程

  可以给定模型元数据,模型元数据是“任何不是字段的数据”,比如排序选项(ordering),数据库表名(db_table)或者人类可读的单复数名称(verbose_name 和verbose_name_plural)。Meta不是必须的。使用形式如下:

from django.db import models

class Ox(models.Model):
    horn_length = models.IntegerField()

    class Meta:
        ordering = ["horn_length"]
        verbose_name_plural = "oxen"
4.1 verbose_name/verbose_name_plural
  • verbose_name: 用于设置一个供使用者查看的对象名称,如果你不指定它,那么Django会使用小写的模型名作为默认值。
  • verbose_name_plural: 模型对象的复数名,因为我们中文通常不区分单复数,所以保持和verbose_name一致也可以。如果不指定该选项,那么默认的复数名字是verbose_name加上‘s’

5 数据库迁移

  首先,需要数据库迁移的应用必须已经安装到了项目中,数据库迁移有两大命令:

  • python manage.py makemigrations: 将model层转为迁移文件migration

  • python manage.py migrate: 将新版本的迁移文件执行,更新数据库。

  这两中命令调用默认为全局,即对所有最新更改的model或迁移文件进行操作。如果想对部分app进行操作,就要在其后追加app name:
 第二条执行数据库操作语句只会执行还没执行过或未更新的迁移文件。 Django 通过在数据库中创建一个特殊的表 django_migrations 来跟踪执行过哪些迁移

python manage.py makemigrations app_name
python manage.py migrate app_name

  如果想要精确到某个迁移文件(0004_xxx.py):

python manage.py migrate app_name 0004
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值