前言
初学DRF经常用到models,也需要我们定义,这里学习各种models的内容
一、models
models.py在api目录下,可以自定义各种模板
二、models.Field
1.常用Field
1.AutoField
如果没有的话,默认会生成一个名称为 id 的列
如果要显式的自定义一个自增列,必须设置primary_key=True.
有big和small的派生类
2.BooleanField
布尔类型,只能是true或false
如果希望可以为空,可添加Blank=True
或使用子类NullBooleanField
3.CharField
用于存储字符串
必须指定max_length,即最大长度
4.TextField
大文本
默认对应的form标签是textarea。
5.DecimalField
十进制的小数类型
max_digits:数字中允许的最大位数
decimal_places:小数点后最大允许位数
6.IntegerField
存储整数 范围为 (-2^31, 2^31 -1 )
可能用到的派生类“
SmallIntegerField: (-32768, 32767),
IntegerField: (-2147483648, 2147483647),
BigIntegerField: (-9223372036854775808, 9223372036854775807),
PositiveSmallIntegerField: (0, 32767),
PositiveIntegerField: (0, 2147483647),
7.EmailField
存储Email地址,会自动检测是否合法
是charField的子类
8.FloatField
浮点类型double
9.SlugField
减号、下划线、字母、数字
必须指定max_length,即最大长度
slug 是唯一的字段,不能出现重复 slug,所以 SlugField 的属性是 unique=True
SlugField 本质上相当于存放字符串,但是在意义上,主要用于把某些字段形成语义化的,可以访问的短网址(slug)字符串。
2.时间相关Field
1.DateField
日期类型 date
auto_now:保存时自动设置该字段为现在日期,最后修改日期
auto_now_add:当该对象第一次被创建是自动设置该字段为现在日期,创建日期。
2.DurationField
输入持续时间,例如 2年, 5个月等。
3.TimeField
时间 HH:MM[:ss[.uuuuuu]]
4.DateTimeField
日期时间类型 datetime
同DateField的参数
3.其他Field
1.ImageField
图片
height_field,width_field:如果提供这两个参数,则图片将按提供的高度和宽度规格保存。
该字段要求 Python Imaging 库Pillow。
会检查上传的对象是否是一个合法图片。
2.FileField
文件
upload_to:一个用于保存上传文件的本地文件系统路径,该路径由 MEDIA_ROOT 中设置
这个字段不能设置primary_key和unique选项.在数据库中存储类型是varchar,默认最大长度为100
3.FilePathField
path:文件的绝对路径,必填
match:用于过滤路径下文件名的正则表达式,该表达式将用在文件名上(不包括路径)。
recursive:True 或 False,默认为 False,指定是否应包括所有子目录的路径。
例如:FilePathField(path="/home/images", match=“foo.*”, recursive=True) 将匹配“/home/images/foo.gif”但不匹配“/home/images/foo/bar.gif”
4.IPAddressField
IPv4 address地址
子类GenericIPAddressField
一个带有检查 IP地址合法性的CharField
:
5.CommaSeparatedIntegerField
用逗号分割的数字=varchar
继承CharField,所以必须 max_lenght 参数
6.URLField
一个带有URL合法性校验的CharField
7.BinaryField
二进制
存储二进制数据。不能使用filter函数获得QuerySet。
2.常用的参数
1.null
如果是True,Django会在数据库中将此字段的值置为NULL,默认值是False
2.blank
如果为True时django的 Admin 中添加数据时可允许空值,可以不填。如果为False则必须填。默认是False。
null纯粹是与数据库有关系的。而blank是与页面必填项验证有关的
3.primary_key = False
主键,对AutoField设置主键后,就会代替原来的自增 id 列
4.auto_now 和 auto_now_add
auto_now 自动创建—无论添加或修改,都是当前操作的时间
auto_now_add 自动创建—永远是创建时的时间
5.choices
一个二维的元组被用作choices,如果这样定义,Django会select box代替普通的文本框,
并且限定choices的值是元组中的值
GENDER_CHOICE = (
(u’M’, u’Male’),
(u’F’, u’Female’),
)
gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
6.max_length
字段长度
7.default
默认值
8.verbose_name
Admin中字段的显示名称,如果不设置该参数时,则与属性名。
9.db_column
数据库中的字段名称
10.unique=True
不允许重复
11.db_index = True
数据库索引
12.editable=True
在Admin里是否可编辑
13.error_messages=None
错误提示
14.auto_created=False
自动创建
15.help_text
在Admin中提示帮助信息
16.validators=[]
验证器
17.upload-to
文件上传时的保存上传文件的目录
三、测试部分field
models.py
class test(models.Model):
BooleanField=models.BooleanField()
CharField=models.CharField(max_length=5,blank=True)
TextField = models.TextField(max_length=5,blank=True)
DecimalField = models.DecimalField(decimal_places=2,max_digits=5,blank=True)
FloatField = models.FloatField(blank=True)
IntegerField = models.IntegerField(blank=True)
BigIntegerField = models.BigIntegerField(blank=True)
SmallIntegerField = models.SmallIntegerField(blank=True)
EmailField = models.EmailField(blank=True)
class Meta:
db_table = 'test'#存储的数据库名称
cd到项目目录下,建库
python manage.py makemigrations
python manage.py migrate
序列化器serializer.py
class testSerializer(serializers.ModelSerializer):
class Meta:
# 使用写好的数据库模型
model = test
# 过滤要返回的字段
fields ='__all__'
视图views.py
class testViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
queryset = test.objects.all()
serializer_class =testSerializer
def post(self, request, *args, **kwargs):
"""
传过来的是一个字典,增加一条
传过来的是一个列表套字典,增加多条数据
"""
ser = None
if isinstance(request.data, dict):
ser = testSerializer(data=request.data)
elif isinstance(request.data, list):
ser = testSerializer(data=request.data, many=True)
ser.is_valid(raise_exception=True)
ser.save()
return Response({'code': 999, 'detail': '添加成功'}, status=status.HTTP_201_CREATED)
url.py
router = routers.DefaultRouter()
router.register('test', testViewSet)
urlpatterns = [
path('admin/', admin.site.urls),
url(r'^', include(router.urls)),
url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')),
然后进入后端查看效果
总结
这里对各种model.field进行使用,以便建立小组项目所需的库,如下所示: