django -- models数据库操作---字段及参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
models操作  - - - -  字段 及 参数
 
所有字段类型:
     AutoField(Field)
         -  int 自增列,必须填入参数 primary_key = True
 
     BigAutoField(AutoField)
         -  bigint自增列,必须填入参数 primary_key = True
 
         注:当model中如果没有自增列,则自动会创建一个列名为 id 的列
         from  django.db  import  models
 
         class  UserInfo(models.Model):
             # 自动创建一个列名为id的且为自增的整数列
             username  =  models.CharField(max_length = 32 )
 
         class  Group(models.Model):
             # 自定义自增列
             nid  =  models.AutoField(primary_key = True )
             name  =  models.CharField(max_length = 32 )
 
     SmallIntegerField(IntegerField):
         -  小整数  - 32768  ~  32767
 
     PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
         -  正小整数  0  ~  32767
     IntegerField(Field)
         -  整数列(有符号的)  - 2147483648  ~  2147483647
 
     PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
         -  正整数  0  ~  2147483647
 
     BigIntegerField(IntegerField):
         -  长整型(有符号的)  - 9223372036854775808  ~  9223372036854775807
 
     BooleanField(Field)
         -  布尔值类型
 
     NullBooleanField(Field):
         -  可以为空的布尔值
 
     CharField(Field)
         -  字符类型
         -  必须提供max_length参数, max_length表示字符长度
 
     TextField(Field)
         -  文本类型
 
     EmailField(CharField):
         -  字符串类型,Django Admin以及ModelForm中提供验证机制
 
     IPAddressField(Field)
         -  字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
 
     GenericIPAddressField(Field)
         -  字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
         -  参数:
             protocol,用于指定Ipv4或Ipv6,  'both' , "ipv4" , "ipv6"
             unpack_ipv4, 如果指定为 True ,则输入::ffff: 192.0 . 2.1 时候,可解析为 192.0 . 2.1 ,开启刺功能,需要protocol = "both"
 
     URLField(CharField)
         -  字符串类型,Django Admin以及ModelForm中提供验证 URL
 
     SlugField(CharField)
         -  字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
 
     CommaSeparatedIntegerField(CharField)
         -  字符串类型,格式必须为逗号分割的数字
 
     UUIDField(Field)
         -  字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
 
     FilePathField(Field)
         -  字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
         -  参数:
                 path,                      文件夹路径
                 match = None ,                正则匹配
                 recursive = False ,           递归下面的文件夹
                 allow_files = True ,          允许文件
                 allow_folders = False ,       允许文件夹
 
     FileField(Field)
         -  字符串,路径保存在数据库,文件上传到指定目录
         -  参数:
             upload_to  =  ""      上传文件的保存路径
             storage  =  None       存储组件,默认django.core.files.storage.FileSystemStorage
 
     ImageField(FileField)
         -  字符串,路径保存在数据库,文件上传到指定目录
         -  参数:
             upload_to  =  ""      上传文件的保存路径
             storage  =  None       存储组件,默认django.core.files.storage.FileSystemStorage
             width_field = None ,   上传图片的高度保存的数据库字段名(字符串)
             height_field = None    上传图片的宽度保存的数据库字段名(字符串)
 
     DateTimeField(DateField)
         -  日期 + 时间格式 YYYY - MM - DD HH:MM[:ss[.uuuuuu]][TZ]
 
     DateField(DateTimeCheckMixin, Field)
         -  日期格式      YYYY - MM - DD
 
     TimeField(DateTimeCheckMixin, Field)
         -  时间格式      HH:MM[:ss[.uuuuuu]]
 
     DurationField(Field)
         -  长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
 
     FloatField(Field)
         -  浮点型
 
     DecimalField(Field)
         -  10 进制小数
         -  参数:
             max_digits,小数总长度
             decimal_places,小数位长度
 
     BinaryField(Field)
         -  二进制类型
 
#注意:这些操作,如果是直接用数据库操作语句进行添加的话,不会有报错或是警告之类的信息
         #但是如果换到后台管理页面上,进行添加则会有相应的警告!
 
常用字段类型:
     字符串:
         EmailField(CharField):
         IPAddressField(Field)
         URLField(CharField)
         SlugField(CharField)
         UUIDField(Field)
         FilePathField(Field)
         FileField(Field)
         ImageField(FileField)
         CommaSeparatedIntegerField(CharField)
     时间类:
         models.DateTimeField(null = True )
     数字:
         num  =  models.IntegerField()
         num  =  models.FloatField()
         mum  =  models.DecimalField(max_digits = 30 ,decimal_places = 10 )   #精确的小数类型
     枚举(Django):  #应用于固定的,百年不修改一次的选项,例如:性别
         color_list  =  (
             ( 1 , '黑色' ),
             ( 2 , '白色' ),
             ( 3 , '蓝色' )
         )
         color  =  models.IntegerField(choices = color_list)
     
         1.  自己操作:
             自己取,自己用
         2.  给Django admin使用
             
         应用场景:选项固定
         
         * PS: 外键应用于经常发生变动的选项!FK选项动态
 
参数:
     字段参数:
         null = True ,
         default = '1111' ,
         db_index = True ,
         unique = True ,
         max_length = xxx 表示字符长度
         primary_key =  True  主键
         
         class  Meta:   # 用于创建多列间的组合操作
             # unique_together = ( #创建有关联的联合唯一索引
             #     ('email','ctime'),
             # )
             # index_together = (  #创建普通的索引
             #     ('email','ctime'),
             # )
 
     DjangoAdmin提供的参数:
         verbose_name        Admin中显示的字段名称
         blank               Admin中是否允许用户输入为空
         editable            Admin中是否可以编辑
         help_text           Admin中该字段的提示信息
         choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
                             如:gf  =  models.IntegerField(choices = [( 0 '何穗' ),( 1 '大表姐' ),],default = 1 )
 
         error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
                             字典健:null, blank, invalid, invalid_choice, unique,  and  unique_for_date
                             如:{ 'null' "不能为空." 'invalid' '格式错误' }
 
         validators          自定义错误验证(列表类型),从而定制想要的验证规则
             from  django.core.validators  import  RegexValidator
             from  django.core.validators  import  EmailValidator,URLValidator,DecimalValidator,\
             MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
             如:
                 test  =  models.CharField(
                     max_length = 32 ,
                     error_messages = {
                         'c1' '优先错信息1' ,
                         'c2' '优先错信息2' ,
                         'c3' '优先错信息3' ,
                     },
                     validators = [
                         RegexValidator(regex = 'root_\d+' , message = '错误了' , code = 'c1' ),
                         RegexValidator(regex = 'root_112233\d+' , message = '又错误了' , code = 'c2' ),
                         EmailValidator(message = '又错误了' , code = 'c3' ), ]
 
* * * 注意点:关于字段:                                    
     a. 直接通过数据库操作语句创建的话,不会报错!
         models.Userinfo.objects.create(....)
         - -  ModelForm
     b. 但是字段会影响Django自带的管理工具admin,不是该字段类型的数据,即刻报错!   
         
 
PS:其他
1 、自定义无符号整数字段
     class  UnsignedIntegerField(models.IntegerField):
         def  db_type( self , connection):
             return  'integer UNSIGNED'
 
     PS: 返回值为字段在数据库中的属性,Django字段默认的值为:
         'AutoField' 'integer AUTO_INCREMENT' ,
         'BigAutoField' 'bigint AUTO_INCREMENT' ,
         'BinaryField' 'longblob' ,
         'BooleanField' 'bool' ,
         'CharField' 'varchar(%(max_length)s)' ,
         'CommaSeparatedIntegerField' 'varchar(%(max_length)s)' ,
         'DateField' 'date' ,
         'DateTimeField' 'datetime' ,
         'DecimalField' 'numeric(%(max_digits)s, %(decimal_places)s)' ,
         'DurationField' 'bigint' ,
         'FileField' 'varchar(%(max_length)s)' ,
         'FilePathField' 'varchar(%(max_length)s)' ,
         'FloatField' 'double precision' ,
         'IntegerField' 'integer' ,
         'BigIntegerField' 'bigint' ,
         'IPAddressField' 'char(15)' ,
         'GenericIPAddressField' 'char(39)' ,
         'NullBooleanField' 'bool' ,
         'OneToOneField' 'integer' ,
         'PositiveIntegerField' 'integer UNSIGNED' ,
         'PositiveSmallIntegerField' 'smallint UNSIGNED' ,
         'SlugField' 'varchar(%(max_length)s)' ,
         'SmallIntegerField' 'smallint' ,
         'TextField' 'longtext' ,
         'TimeField' 'time' ,
         'UUIDField' 'char(32)' ,
 
注意事项
     1. 触发Model中的验证和错误提示有两种方式:
         a. Django Admin中的错误信息会优先根据Admiin内部的ModelForm错误信息提示,如果都成功,才来检查Model的字段并显示指定错误信息
         b. 使用ModelForm
         c. 调用Model对象的 clean_fields 方法,如:
             # models.py
             class  UserInfo(models.Model):
                 nid  =  models.AutoField(primary_key = True )
                 username  =  models.CharField(max_length = 32 )
 
                 email  =  models.EmailField(error_messages = { 'invalid' '格式错了.' })
 
             # views.py
             def  index(request):
                 obj  =  models.UserInfo(username = '11234' , email = 'uu' )
                 try :
                     print (obj.clean_fields())
                 except  Exception as e:
                     print (e)
                 return  HttpResponse( 'ok' )
 
            # Model的clean方法是一个钩子,可用于定制操作,如:上述的异常处理。
 
     2.Admin 中修改错误提示
         # admin.py
         from  django.contrib  import  admin
         from  model_club  import  models
         from  django  import  forms
 
 
         class  UserInfoForm(forms.ModelForm):
             age  =  forms.IntegerField(initial = 1 , error_messages = { 'required' '请输入数值.' 'invalid' '年龄必须为数值.' })
 
             class  Meta:
                 model  =  models.UserInfo
                 # fields = ('username',)
                 fields  =  "__all__"
                 exclude  =  [ 'title' ]
                 labels  =  'name' : 'Writer' , }
                 help_texts  =  { 'name' : 'some useful help text.' ,}
                 error_messages = 'name' :{ 'max_length' : "this writer name is too long" } }
                 widgets = { 'name' :Textarea(attrs = { 'cols' : 80 , 'rows' : 20 })}
 
         class  UserInfoAdmin(admin.ModelAdmin):
             form  =  UserInfoForm
 
         admin.site.register(models.UserInfo, UserInfoAdmin)
 
django amdin是django提供的一个后台管理页面,改管理页面提供完善的html和css,
     使得你在通过Model创建完数据库表之后,就可以对数据进行增删改查,
     而使用django admin 则需要以下步骤:
         1 、创建后台管理员
         2 、配置url
         3 、注册和配置django admin后台管理页面
 
举例:app01项目下:
1 、在models.py文件中创建ORM对象
     from  django.db  import  models
     from  django.core.validators  import  RegexValidator
     from  django.core.validators  import  EmailValidator,URLValidator,DecimalValidator,\
         MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
 
     # Create your models here.
     class  UserAdmin(models.Model):
         username  =  models.CharField(max_length = 32 ,)
         password  =  models.CharField(max_length = 64 ,)
 
     class  UserInfo(models.Model):
         username  =  models.CharField(max_length = 32 ,verbose_name = "用户名" ,editable = True ,help_text = "请输入你的姓名" )
         email  =  models.EmailField(null = True ,unique = True ,
                                   blank = True ,verbose_name = "邮箱" ,editable = True ,help_text = "请输入邮箱,like:111@163.com" )
         # default = "111@163.com"
         datetime  = models.DateField(null = True )   #只有年月日 一个日期的选择框
         ctime  =  models.DateTimeField(null = True ,verbose_name = "时间" #年月日,时分秒 两个选择框
         six_list  =  (
             ( 1 , "男" ),
             ( 2 , "女" ),
         )
         six  =  models.IntegerField(choices = six_list,verbose_name = "性别" )   #以下拉框的形式在页面展示
         test  =  models.CharField(verbose_name = "错误测试" ,
             max_length = 32 ,
             error_messages = {
                 'c1' '输入信息的格式不正确!' ,
             }, #用于定制想要显示的错误信息,优先级高于validators,字典类型,通过键值对匹配,key是validators中code设置的名字!
             validators = [RegexValidator(regex = 'root_\d+' , message = '错误了' , code = 'c1' )],
             #正则匹配输入的字符串,如果不满足规则就会提示错误信息,若没有error_messages插足,就显示自己的错误信息
             null = True ,
         )
 
2 、在admin.py中执行如下配置,用于操作创建的数据库表
     from  django.contrib  import  admin
     from  app01  import  models
     admin.site.register(models.UserInfo)
     
     -  创建后台管理员:
             python3 manage.py createsuperuser


原文:https://www.cnblogs.com/zh605929205/articles/7103825.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 安装Elasticsearch和Python Elasticsearch客户端 - Elasticsearch安装可以参考官网的[安装文档](https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html) - Python Elasticsearch客户端可以使用pip安装:`pip install elasticsearch` 2. 在Django项目中创建一个app,用于处理与Elasticsearch相关的逻辑。 3. 配置Elasticsearch连接信息,可以在Django的`settings.py`中添加以下配置: ``` ELASTICSEARCH_DSL = { 'default': { 'hosts': 'localhost:9200' }, } ``` 其中,`hosts`就是Elasticsearch的地址,这里使用默认的`localhost:9200`。 4. 创建Elasticsearch索引模板,可以在app目录下创建一个`search_indexes.py`文件,定义索引模板: ``` from elasticsearch_dsl import Document, Text, Date, Keyword class ArticleIndex(Document): title = Text() content = Text() pub_date = Date() tags = Keyword(multi=True) class Index: name = 'articles' ``` 其中,`ArticleIndex`是一个继承自`Document`的类,定义了索引的字段和类型。`Index`类中的`name`属性指定了索引的名称。 5. 在app目录下创建`serializers.py`文件,定义序列化器,将模型序列化为Elasticsearch索引模板: ``` from rest_framework import serializers from .models import Article from .search_indexes import ArticleIndex class ArticleIndexSerializer(serializers.ModelSerializer): class Meta: model = Article fields = ('id', 'title', 'content', 'pub_date', 'tags') def save(self, **kwargs): article = super().save(**kwargs) article_index = ArticleIndex(meta={'id': article.id}, **article.__dict__) article_index.save() return article ``` 其中,`ArticleIndexSerializer`继承自`ModelSerializer`,定义了序列化的模型和字段。在`save`方法中,先保存模型,再将模型数据序列化为Elasticsearch索引模板,最后保存到Elasticsearch中。 6. 在app目录下创建`views.py`文件,定义视图函数,实现Elasticsearch搜索功能: ``` from rest_framework.views import APIView from rest_framework.response import Response from elasticsearch_dsl import Q from .search_indexes import ArticleIndex from .serializers import ArticleIndexSerializer class ArticleSearchView(APIView): def get(self, request): query = request.query_params.get('q', '') s = ArticleIndex.search().query( Q('multi_match', query=query, fields=['title', 'content', 'tags']) ) response = [] for hit in s.execute().hits: serializer = ArticleIndexSerializer(data=hit.to_dict()) serializer.is_valid() response.append(serializer.data) return Response(response) ``` 其中,`ArticleSearchView`继承自`APIView`,定义了一个`get`方法,接收`q`参数作为搜索关键词。通过Elasticsearch DSL构建查询语句,搜索索引模板中的数据,最后将搜索结果序列化返回。 7. 在app目录下创建`urls.py`文件,定义路由: ``` from django.urls import path from .views import ArticleSearchView urlpatterns = [ path('search/', ArticleSearchView.as_view(), name='article_search'), ] ``` 其中,`search`路由对应了`ArticleSearchView`视图函数。 8. 在Django的`settings.py`中添加app,配置数据库信息: ``` INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'app_name', # 添加app ] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'db_name', 'USER': 'db_user', 'PASSWORD': 'db_password', 'HOST': 'localhost', 'PORT': '3306', } } ``` 9. 在app目录下创建`models.py`文件,定义模型,使用Django ORM作为数据源: ``` from django.db import models class Article(models.Model): title = models.CharField(max_length=255) content = models.TextField() pub_date = models.DateTimeField(auto_now_add=True) tags = models.CharField(max_length=255, blank=True) def __str__(self): return self.title ``` 其中,`Article`是一个继承自`models.Model`的类,定义了文章的属性。 10. 在app目录下创建`admin.py`文件,注册模型到Django Admin中: ``` from django.contrib import admin from .models import Article admin.site.register(Article) ``` 11. 在Django的`urls.py`中添加app的路由: ``` from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('api/', include('app_name.urls')), ] ``` 12. 启动Django开发服务器,访问`http://localhost:8000/admin/`,进入Django Admin,创建一些文章数据。 13. 访问`http://localhost:8000/api/search/?q=django`,可以看到搜索结果,其中包含关键词`django`的文章数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值