字段和字段的参数,查询的13个方法,但标的双下划线外键和多对多操作
字段?
常用字段?
IntegerField()
一個整數(shù)類型。數(shù)值的范圍是?-2147483648 ~ 2147483647。
BooleanField()
布爾值類型
CharField()
字符類型,必須提供max_length參數(shù)。max_length表示字符的長度。
TextField()
文本類型
DateTimeField?
日期時間字段,格式為YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相當(dāng)于Python中的datetime.datetime的實例。
DateField
日期類型,日期格式為YYYY-MM-DD,相當(dāng)于Python中的datetime.date的實例。
參數(shù):
- auto_now:每次修改時修改為當(dāng)前日期時間。
- auto_now_add=True:新創(chuàng)建對象時自動添加當(dāng)前日期時間。
auto_now和auto_now_add和default參數(shù)是互斥的,不能同時設(shè)置。
DecimalField
10進制小數(shù) 參數(shù): max_digits 小數(shù)總長度,decimal_places,小數(shù)位長度
?
字段類型,詳情可點擊查詢官網(wǎng)。
AutoField(Field)- int自增列,必須填入?yún)?shù) primary_key=TrueBigAutoField(AutoField)- bigint自增列,必須填入?yún)?shù) primary_key=True注:當(dāng)model中如果沒有自增列,則自動會創(chuàng)建一個列名為id的列from django.db import modelsclass UserInfo(models.Model):# 自動創(chuàng)建一個列名為id的且為自增的整數(shù)列username = models.CharField(max_length=32)class Group(models.Model):# 自定義自增列nid = models.AutoField(primary_key=True)name = models.CharField(max_length=32)SmallIntegerField(IntegerField):- 小整數(shù) -32768 ~ 32767PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)- 正小整數(shù) 0 ~ 32767IntegerField(Field)- 整數(shù)列(有符號的) -2147483648 ~ 2147483647PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)- 正整數(shù) 0 ~ 2147483647BigIntegerField(IntegerField):- 長整型(有符號的) -9223372036854775808 ~ 9223372036854775807BooleanField(Field)- 布爾值類型NullBooleanField(Field):- 可以為空的布爾值CharField(Field)- 字符類型- 必須提供max_length參數(shù), max_length表示字符長度TextField(Field)- 文本類型EmailField(CharField):- 字符串類型,Django Admin以及ModelForm中提供驗證機制IPAddressField(Field)- 字符串類型,Django Admin以及ModelForm中提供驗證 IPV4 機制GenericIPAddressField(Field)- 字符串類型,Django Admin以及ModelForm中提供驗證 Ipv4和Ipv6- 參數(shù):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中提供驗證 URLSlugField(CharField)- 字符串類型,Django Admin以及ModelForm中提供驗證支持 字母、數(shù)字、下劃線、連接符(減號)CommaSeparatedIntegerField(CharField)- 字符串類型,格式必須為逗號分割的數(shù)字UUIDField(Field)- 字符串類型,Django Admin以及ModelForm中提供對UUID格式的驗證FilePathField(Field)- 字符串,Django Admin以及ModelForm中提供讀取文件夾下文件的功能- 參數(shù):path, 文件夾路徑match=None, 正則匹配recursive=False, 遞歸下面的文件夾allow_files=True, 允許文件allow_folders=False, 允許文件夾FileField(Field)- 字符串,路徑保存在數(shù)據(jù)庫,文件上傳到指定目錄- 參數(shù):upload_to = "" 上傳文件的保存路徑storage = None 存儲組件,默認django.core.files.storage.FileSystemStorageImageField(FileField)- 字符串,路徑保存在數(shù)據(jù)庫,文件上傳到指定目錄- 參數(shù):upload_to = "" 上傳文件的保存路徑storage = None 存儲組件,默認django.core.files.storage.FileSystemStoragewidth_field=None, 上傳圖片的高度保存的數(shù)據(jù)庫字段名(字符串)height_field=None 上傳圖片的寬度保存的數(shù)據(jù)庫字段名(字符串)DateTimeField(DateField)- 日期+時間格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]DateField(DateTimeCheckMixin, Field)- 日期格式 YYYY-MM-DDTimeField(DateTimeCheckMixin, Field)- 時間格式 HH:MM[:ss[.uuuuuu]]DurationField(Field)- 長整數(shù),時間間隔,數(shù)據(jù)庫中按照bigint存儲,ORM中獲取的值為datetime.timedelta類型FloatField(Field)- 浮點型DecimalField(Field)- 10進制小數(shù)- 參數(shù):max_digits,小數(shù)總長度decimal_places,小數(shù)位長度BinaryField(Field)- 二進制類型字段類型 字段類型自定義字段
自定義一個二進制字段,以及Django字段與數(shù)據(jù)庫字段類型的對應(yīng)關(guān)系。
class UnsignedIntegerField(models.IntegerField):def db_type(self, connection):return 'integer UNSIGNED'# PS: 返回值為字段在數(shù)據(jù)庫中的屬性。 # Django字段與數(shù)據(jù)庫字段類型對應(yīng)關(guān)系如下:'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)', 相信我你,不會想看的自定義一個char類型字段:
class MyCharField(models.Field):"""自定義的char類型的字段類"""def __init__(self, max_length, *args, **kwargs):self.max_length = max_lengthsuper(MyCharField, self).__init__(max_length=max_length, *args, **kwargs)def db_type(self, connection):"""限定生成數(shù)據(jù)庫表的字段類型為char,長度為max_length指定的值"""return 'char(%s)' % self.max_length調(diào)用:
使用自定義char類型字段:
class Class(models.Model):id = models.AutoField(primary_key=True)title = models.CharField(max_length=25)# 使用自定義的char類型的字段cname = MyCharField(max_length=25)創(chuàng)建的表結(jié)構(gòu):
字段參數(shù)
?字段參數(shù),詳情可點擊查看官網(wǎng)。
null 數(shù)據(jù)庫中字段是否可以為空 這個一般和blank一起用db_column (卡冷) 數(shù)據(jù)庫中字段的列名default (第fao特) 數(shù)據(jù)庫中字段的默認值primary_key(噗ruai魔蕊) 數(shù)據(jù)庫中字段是否為主鍵db_index 數(shù)據(jù)庫中字段是否可以建立索引unique(優(yōu)尼科) 數(shù)據(jù)庫中字段是否可以建立唯一索引unique_for_date 數(shù)據(jù)庫中字段【日期】部分是否可以建立唯一索引unique_for_month 數(shù)據(jù)庫中字段【月】部分是否可以建立唯一索引unique_for_year 數(shù)據(jù)庫中字段【年】部分是否可以建立唯一索引verbose_name Admin中顯示的字段名稱blank (波蘭可) Admin中是否允許用戶輸入為空 他是說在頁面的表單允許為空嗎 editable Admin中是否可以編輯help_text Admin中該字段的提示信息choices Admin中顯示選擇框的內(nèi)容,用不變動的數(shù)據(jù)放在內(nèi)存中從而避免跨表操作如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)error_messages 自定義錯誤信息(字典類型),從而定制想要顯示的錯誤信息;字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date如:{'null': "不能為空.", 'invalid': '格式錯誤'}validators 自定義錯誤驗證(列表類型),從而定制想要的驗證規(guī)則from django.core.validators import RegexValidatorfrom django.core.validators import EmailValidator,URLValidator,DecimalValidator,\MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator如:test = models.CharField(max_length=32,error_messages={'c1': '優(yōu)先錯信息1','c2': '優(yōu)先錯信息2','c3': '優(yōu)先錯信息3',},validators=[RegexValidator(regex='root_\d+', message='錯誤了', code='c1'),RegexValidator(regex='root_112233\d+', message='又錯誤了', code='c2'),EmailValidator(message='又錯誤了', code='c3'), ])Model Meta參數(shù)
這個不是很常用,如果你有特殊需要可以使用。詳情點擊查看官網(wǎng)。
可以顯示中文
class UserInfo(models.Model):nid = models.AutoField(primary_key=True)username = models.CharField(max_length=32)class Meta:# 數(shù)據(jù)庫中生成的表名稱 默認 app名稱 + 下劃線 + 類名db_table = "table_name"# admin中顯示的表名稱verbose_name = '個人信息'# verbose_name加sverbose_name_plural = '所有用戶信息'# 聯(lián)合索引 index_together = [("pub_date", "deadline"), # 應(yīng)為兩個存在的字段 ]# 聯(lián)合唯一索引unique_together = (("driver", "restaurant"),) # 應(yīng)為兩個存在的字段 想看嗎,點我呀 class Person(models.Model):id = models.AutoField(primary_key=True)name = models.CharField(max_length=32, verbose_name='姓名')age = models.IntegerField(null=True, blank=True, verbose_name='年齡')birth = models.DateTimeField(auto_now_add=True)phone = MyCharField(max_length=11, verbose_name='手機號')gender = models.BooleanField(choices=((0, '女'), (1, '男')),verbose_name='性別') # 可迭代
ORM操作
創(chuàng)建一個文件orm? 創(chuàng)建一個py文件,以后可以在py文件里操作ORM記錄可以保存
import osif __name__ == '__main__':os.environ.setdefault("DJANGO_SETTINGS_MODULE", "這里寫項目名.settings")import djangodjango.setup()from app01 import models #導(dǎo)入項目里的app基本操作
# 增 models.Tb1.objects.create(c1='xx', c2='oo') # 增加一條數(shù)據(jù),可以接受字典類型數(shù)據(jù) **kwargs obj = models.Tb1(c1='xx', c2='oo') obj.save()# 查 models.Tb1.objects.get(id=123) # 獲取單條數(shù)據(jù),不存在則報錯(不建議) models.Tb1.objects.all() # 獲取全部 models.Tb1.objects.filter(name='seven') # 獲取指定條件的數(shù)據(jù) filter(f有特) models.Tb1.objects.exclude(name='seven') # 去除指定條件的數(shù)據(jù) exclude(ex錄得)# 刪 # models.Tb1.objects.filter(name='seven').delete() # 刪除指定條件的數(shù)據(jù)# 改 models.Tb1.objects.filter(name='seven').update(gender='0') # 將指定條件的數(shù)據(jù)更新,均支持 **kwargs obj = models.Tb1.objects.get(id=1) obj.c1 = '111' obj.save() # 修改單條數(shù)據(jù)查詢的13種方法
<1> all(): 查詢所有結(jié)果<2> get(**kwargs): 返回與所給篩選條件相匹配的對象,返回結(jié)果有且只有一個,如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。<3> filter(**kwargs): 它包含了與所給篩選條件相匹配的對象<4> exclude(**kwargs): 它包含了與所給篩選條件不匹配的對象<5> values(*field): 返回一個ValueQuerySet——一個特殊的QuerySet,運行后得到的并不是一系列model的實例化對象,而是一個可迭代的字典序列<6> values_list(*field): 它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列<7> order_by(*field):(奧德) 對查詢結(jié)果排序<8> reverse(): (蕊我死) 對查詢結(jié)果反向排序,請注意reverse()通常只能在具有已定義順序的QuerySet上調(diào)用(在model類的Meta中指定ordering或調(diào)用order_by()方法)。<9> distinct(): 從返回結(jié)果中剔除重復(fù)紀錄(如果你查詢跨越多個表,可能在計算QuerySet時得到重復(fù)的結(jié)果。此時可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。)<10> count(): (康特) 返回數(shù)據(jù)庫中匹配查詢(QuerySet)的對象數(shù)量。<11> first(): 返回第一條記錄<12> last(): 返回最后一條記錄<13> exists(): 如果QuerySet包含數(shù)據(jù),就返回True,否則返回False返回QuerySet對象的方法有
all()
filter()
exclude()
order_by()
reverse()
distinct()
特殊的QuerySet
values()? ? ? ?返回一個可迭代的字典序列
values_list() 返回一個可迭代的元祖序列
返回具體對象的
get()
first()
last()
返回布爾值的方法有:
exists()
返回數(shù)字的方法有
count()
dj給提供了一個后臺管理的一個東西? ?admin
在app里面的admin配置
from django.contrib import admin from app01 import models admin.site.register(models.Person)在黑框里輸入python manage.py createsuperuser 創(chuàng)建一個超級用戶? wang123456
單表查詢之神奇的雙下劃線
ret = models.Person.objects.filter(id=1)#僅僅是一個 ret = models.Person.objects.filter(id__gt=1) # greater than id大于1的 ret = models.Person.objects.filter(id__gte=1) # greater than equal 大于等于1的 ret = models.Person.objects.filter(id__lt=3) # less than id小于3的 ret = models.Person.objects.filter(id__lte=3) # less than equal 小于等于的ret = models.Person.objects.filter(id__gt=1, id__lt=3) #條件大于1 然后小于3 ret = models.Person.objects.filter(id__range=[1, 3]) # 范圍 左右都包含 ret = models.Person.objects.filter(id__in=[1, 3]) #ret = models.Person.objects.filter(name__contains='alex') # 包含 like ret = models.Person.objects.filter(name__icontains='alex') # 包含 likeret = models.Person.objects.filter(name__startswith='a') # 以什么開頭 ret = models.Person.objects.filter(name__istartswith='a') # 以什么開頭 忽略大小寫ret = models.Person.objects.filter(name__endswith='x') # 以什么結(jié)尾 ret = models.Person.objects.filter(name__iendswith='X') # 以什么結(jié)尾 忽略大小寫ret = models.Person.objects.filter(birth__year=2018)# 查詢時間 ret = models.Person.objects.filter(birth__contains='2018-12') __isnull=True可以是空
ForeignKey操作
數(shù)據(jù)庫:
class Publisher(models.Model):name = models.CharField(max_length=32)def __str__(self):return self.nameclass Book(models.Model):title = models.CharField(max_length=32)publisher = models.ForeignKey('Publisher', related_name='books', related_query_name='book',null=True)def __str__(self):return self.titleclass Author(models.Model):name = models.CharField(max_length=32)books = models.ManyToManyField('Book',related_name='authors')
創(chuàng)建的py文件里:
外鍵的操作:
# 基于對象的查詢 # 正向 有外鍵的一側(cè) 查關(guān)聯(lián)的對象 book_obj = models.Book.objects.get(id=1)print(book_obj.id) print(book_obj.title) print(book_obj.publisher) # 關(guān)聯(lián)的對象 print(book_obj.publisher_id) # 關(guān)聯(lián)的對象的id print(book_obj.publisher.id) # 關(guān)聯(lián)的對象的id# 反向查詢 被關(guān)聯(lián)的對象 查有外鍵的一側(cè) pub_obj = models.Publisher.objects.get(id=1) print(pub_obj.name)# 查詢出出版社出版的所有書籍 # 不指定 related_name='books' print(pub_obj.book_set,type(pub_obj.book_set)) print(pub_obj.book_set.all())# 指定related_name='books' print(pub_obj.books,type(pub_obj.books)) print(pub_obj.books.all())# 基于字段的查詢ret = models.Book.objects.filter(publisher__name='出版社')# 不指定related_name ret = models.Publisher.objects.filter(book__title='書')# 指定related_name ret = models.Publisher.objects.filter(books__title='書')# 指定related_query_name='book' ret = models.Publisher.objects.filter(book__title='書')print(ret)# 外鍵字段可以為null 才有remove和clear 只能寫對象 pub_obj = models.Publisher.objects.get(id=1) pub_obj.books.remove(models.Book.objects.get(id=1)) pub_obj.books.clear()pub_obj.books.create(title='書籍')多對多
# 基于對象的查詢 # 正向 author_obj = models.Author.objects.get(id=2) # print(author_obj.books,type(author_obj.books)) print(author_obj.books.all())# 反向 book_obj = models.Book.objects.get(id=1)# 不指定related_name='authors' print(book_obj.author_set.all())# 指定related_name='authors' print(book_obj.authors.all())設(shè)置關(guān)系
# set 設(shè)置多對多關(guān)系 author_obj.books.set([]) author_obj.books.set([1,2,3]) # 要關(guān)聯(lián)對象的ID [ 對象的id,對象的id] author_obj.books.set(models.Book.objects.all()) # 要關(guān)聯(lián)對象 [ 對象,對象]# add 添加多對多的關(guān)系 author_obj.books.add(1) # 要關(guān)聯(lián)對象的ID author_obj.books.add(models.Book.objects.get(id=2)) # 要關(guān)聯(lián)對象# remove() 刪除多對多的關(guān)系author_obj.books.remove(1) # 要關(guān)聯(lián)對象的id author_obj.books.remove(models.Book.objects.get(id=2)) # 要關(guān)聯(lián)對象clear() # 清空當(dāng)前對象的多對多的關(guān)系 author_obj.books.clear()create()#新建 author_obj.books.create(title='添加書籍',)book_obj.authors.create(name='alex')
?
轉(zhuǎn)載于:https://www.cnblogs.com/xihuanniya/p/10078328.html
總結(jié)
以上是生活随笔為你收集整理的字段和字段的参数,查询的13个方法,但标的双下划线外键和多对多操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018.12.05 codeforce
- 下一篇: shelve 序列化模块——day18