使用 Django 创建模型的时候一定会经常使用外键来创建两个表格之间多对一的外键关系,例如B中有一个 models.ForeignKey(A) 。而当我们需要反向查询 A 中某个具体实例所关联的 B 时,可能会用到以下两种方法:
相关实例的方法,可以参考官方的官方文档。
对于每一个具有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())
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)
官方参考资料
关于数据库model的介绍可以查看官网文档。
该参数接收一个可迭代的列表或元组(基本单位为二元组)。如果指定了该参数,在实例化该模型时,该字段只能取选项列表中的值。每个二元组的第一个值会储存在数据库中,而第二个值将只会用于显示作用。
对于一个模型实例,要获取该字段二元组中相对应的第二个值,使用 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)
设置备注名
一个提供数据上传的字段。
不能将该字段设置为主键,否则会报错。
class FileField(upload_to=None, max_length=100, **options)
参数类型:
区别与null,null关系到数据库,而blank关系到数据库验证。
注意如果设置了null为ture,那个需要同时将blank设置为true。
这个属性继承了FileField的全部属性,只不过他需要做存储的必须是图片的验证。
class ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)
设置一个多对一关系,即外键。
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
用在ForeignKey上,related_name 可以给这个外键定义好一个别的名称,作为关联对象的反向引用描述符。同时可以将该字段设置为"+"或者以“+”结束,来表示该模型不具有向后关系。
django 默认每个主表的对象都有一个是外键的属性,可以通过它来查询到所有属于主表的子表的信息。这个属性的名称默认是以子表的名称小写加上_set()来表示(上面默认以b_set访问),默认返回的是一个querydict对象。可以使用relatd_name来显性声明。
参考于博主教程
可以给定模型元数据,模型元数据是“任何不是字段的数据”,比如排序选项(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"
首先,需要数据库迁移的应用必须已经安装到了项目中,数据库迁移有两大命令:
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