真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Model怎么在Django中使用-創(chuàng)新互聯(lián)

本篇文章給大家分享的是有關(guān)Model怎么在Django中使用,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)公司是專業(yè)的可克達拉網(wǎng)站建設(shè)公司,可克達拉接單;提供網(wǎng)站設(shè)計制作、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行可克達拉網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

創(chuàng)建模型

使用Django的模型主要注意兩個方面:字段的類型和方法的重寫。這里用一個例子來說明,其中包含了常用的字段類型和如何重寫方法。

from django.db import models
class School(models.Model):
 pass
class Message(models.Model):
 pass
class Teacher(models.Model):
 pass
 class Student(models.Model):
 GENDER_CHOICES = (
  ('male', "男"),
  ('female', "女"),
  ('secret', "保密")
 )

 name = models.CharField(max_length=40, blank=True, verbose_name="姓名")
 gender = models.CharField(max_length=6, choices=GENDER_CHOICES, default="secret", verbose_name="性別")
 age = models.IntegerField(default=0, verbose_name="年齡")
 rank = models.PositiveIntegerField(default=1, verbose_name="排名", unique=True)
 discount = models.DecimalField(max_digits=3, decimal_places=2, verbose_name="折扣", default=1.0)
 school = models.ForeignKey(to=School, verbose_name="學(xué)校", on_delete=models.CASCADE)
 message = models.OneToOneField(to=Message, verbose_name="信息", on_delete=models.CASCADE)
 teacher = models.ManyToManyField(verbose_name="老師", to=Teacher, blank=True)
 introduce = models.TextField(blank=True, verbose_name="介紹")
 grade = models.FloatField(default=0.0, verbose_name="成績")
 url = models.URLField(verbose_name="個人主頁", max_length=100)
 email = models.EmailField(verbose_name="郵箱")
 image = models.ImageField(upload_to='img/%Y/%m/%d/', verbose_name='上傳圖片', null=True)
 file = models.FileField(upload_to="file/%Y/%m/%d/", verbose_name="上傳文件", blank=True)
 is_deleted = models.BooleanField(verbose_name="已刪除", default=False, blank=True)
 time_added = models.DateTimeField(verbose_name="添加時間", auto_now_add=True, blank=True)
 def delete(self, using=None, keep_parents=False):
  self.is_deleted = True
  # some actions
  self.save()
 def save(self, force_insert=False, force_update=False, using=None,
    update_fields=None):
  # some actions
  self.name = self.name.capitalize() # 首字母大寫
  return super().save(force_insert=force_insert, force_update=force_update, using=using,
       update_fields=update_fields)
 def __repr__(self):
  return "UserProfile:{}".format(self.name)
 def __str__(self):
  return self.name
 class Meta:
  ordering = ['-time_added']
  verbose_name = "用戶信息"
  verbose_name_plural = verbose_name
  db_table = "student_info"

字段類型

這里對常見字段中值得注意的地方作一下說明。

CharField

字符串類型值得注意的是當(dāng)該字段只能在是某些指定的值時,要使用choices參數(shù)來指向預(yù)先設(shè)定的值。

IntergerField & PositiveIntegerField

整數(shù)類型和正整數(shù)類型。

DecimalField

十進制浮點數(shù),其中,參數(shù)max_digits代表數(shù)字有多少位,decimal_places代表小數(shù)部分有多少位。

ForeignKey

使用to指向被關(guān)聯(lián)的模型,使用on_delete來規(guī)定被關(guān)聯(lián)對象刪除時該對象的處理方式。主要有兩種取值,models.CASCADE和models.SET_NULL。models.CASCADE表示當(dāng)被關(guān)聯(lián)對象刪除時刪除該對象,models.SET_NULL表示當(dāng)被關(guān)聯(lián)對象被刪除時將該對象設(shè)置為空,此設(shè)置的前提是該字段要允許為空。

ImageField & FileField

使用upload_to參數(shù)來指定文件保存的路徑。注意,該路徑前面再加上 MEDIA_ROOT中設(shè)置的路徑就是上傳的文件真實保存路徑了,如 MEDIA_ROOT的路徑是'/home/media',那圖片上傳的路徑就類似/home/media/img/2018/03/06。

BooleanField

布爾類型,可以使用default指定默認(rèn)值。

DateTimeField

在Django中,代表時間字段的有三種:DateTimeField、DateField、TimeField,三種類型分別對應(yīng)datetime()、date()、time(),都有auto_now和auto_now_add參數(shù)。

  • auto_now
     默認(rèn)值為False,設(shè)置為True時會在每次修改該對象時自動更新為當(dāng)前時間,但是無法手動修改該字段的值。

  • auto_now_add
     默認(rèn)值為False,設(shè)置為True時會在創(chuàng)建對象時自動設(shè)置為當(dāng)前時間,之后都不再修改,也不能手動修改其值。

  • 默認(rèn)當(dāng)前時間,又能修改
     有時候我們需要在創(chuàng)建對象時設(shè)置字段的值為當(dāng)前時間,在后續(xù)時又能修改,使用auto_now或者auto_now_add都無法實現(xiàn)這一點。此時,可以使用default參數(shù)來設(shè)置默認(rèn)值,如下

from django.db import models
from django.utils import timezone
class Message(models.Model):
add_date = models.DateTimeField(verbose_name='保存日期',default = timezone.now)
mod_date = models.DateTimeField(verbose_name='最后修改日期', auto_now = True)

重寫方法

delete

Django默認(rèn)的刪除是將數(shù)據(jù)從數(shù)據(jù)庫里刪除,有時候我們需要軟刪除,保存以前的數(shù)據(jù),這時候我們可以使用一個布爾類型的字段標(biāo)識該條數(shù)據(jù)是否刪除,這時需要重寫delete方法實現(xiàn)軟刪除。

在delete方法中將is_deleted的值設(shè)置為True,表示該條數(shù)據(jù)已刪除。此外還可以執(zhí)行一些關(guān)聯(lián)的動作,比如對相關(guān)字段賦值等,最后保存對象。

save

重寫save方法可以讓我們在保存數(shù)據(jù)時做一些相關(guān)的操作,比如保存姓名時自動設(shè)置為首字母大寫,執(zhí)行完之后需要調(diào)用父類的save方法進行保存。

repr & str

兩者的作用是將變量或者常量轉(zhuǎn)換為字符串對象,這里重寫該方法使得對象實例能被轉(zhuǎn)化為字符串。

class Meta

  • ordering:結(jié)果集按照何種方式排序,上面例子表示按添加時間的逆序排序

  • verbose_name:對象的名稱

  • verbose_name_plural:對象復(fù)數(shù)形式的名稱

  • db_table:在數(shù)據(jù)庫中的表名

常用方法

在對常用方法介紹部分,由于上面的模型包含字段較多,所以不使用上面創(chuàng)建的模型。這里使用一些常見的模型,通過名字就可以知道代表的內(nèi)容,因此就不列出模型了。

創(chuàng)建實例

create

使用create方法可以創(chuàng)建一個模型實例,將各字段在參數(shù)中設(shè)置各個字段的值。

student = Student.objects.create(name='zhangsan', gender='male')

get_or_create

get_or_create的作用是查詢一個實例,當(dāng)實例不存在時則創(chuàng)建一個實例。

obj, created = Person.objects.get_or_create(
 first_name='John',
 last_name='Lennon',
 defaults={'birthday': date(1940, 10, 9)},
)

函數(shù)返回一個(object, created)的tuple,object是查詢或者創(chuàng)建的對象實例,created是個布爾類型的值,表示是否是新創(chuàng)建的實例。在查詢時使用defaults以外的參數(shù)進行查詢,當(dāng)實例不存在時將包含default參數(shù)一起創(chuàng)建一個新的實例。功能類似于如下代碼:

try:
 obj = Person.objects.get(first_name='John', last_name='Lennon')
except Person.DoesNotExist:
 obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
 obj.save()

update_or_create

update_or_create的作用是更新一個實例,當(dāng)實力不存在時則創(chuàng)建一個實例。

obj, created = Person.objects.update_or_create(
 first_name='John', last_name='Lennon',
 defaults={'first_name': 'Bob'},
)

函數(shù)返回一個(object, created)的tuple,object是更新或者創(chuàng)建的對象實例,created是個布爾類型的值,表示是否是新創(chuàng)建的實例。在查詢的對象實例存在時,使用default中的參數(shù)進行更新,當(dāng)實例不存在時,創(chuàng)建新的對象實例,需要更新的字段的值設(shè)置為default中的值。功能類似:

defaults = {'first_name': 'Bob'}
try:
 obj = Person.objects.get(first_name='John', last_name='Lennon')
 for key, value in defaults.items():
  setattr(obj, key, value)
 obj.save()
except Person.DoesNotExist:
 new_values = {'first_name': 'John', 'last_name': 'Lennon'}
 new_values.update(defaults)
 obj = Person(**new_values)
 obj.save()

add

這里補充一下add方法,add用在多對多的關(guān)系模型上,表示添加該字段的指向?qū)ο蟆?/p>

>>> john = Author.objects.create(name="John")
>>> paul = Author.objects.create(name="Paul")
>>> george = Author.objects.create(name="George")
>>> ringo = Author.objects.create(name="Ringo")
>>> entry.authors.add(john, paul, george, ringo)

上面的Author表示作者模型,entry表示書籍條目,一本書可以有多個作者,采用多對多關(guān)系。add可以為書的實例添加多個作者。

查詢

all

all方法查詢該對象的所有實例。

all_entries = Entry.objects.all()

get

使用get查詢實例,當(dāng)實例不存在時會返回一個不存在異常。

>>> entry = Entry.objects.get(pk=1)
>>> cheese_blog = Blog.objects.get(name="Cheddar Talk")

filter

filter返回一個QuerySet,而不是對象實例,當(dāng)查詢結(jié)果不存在時返回空的QuerySet,而不是返回一場,可以對結(jié)果集作切片操作來獲取實例內(nèi)容。下面代碼功能在有對象實例時等同于上面get的操作。

>>> entry = Entry.objects.filter(pk=1)[0]
>>> cheese_blog = Blog.objects.filter(name="Cheddar Talk")[0]

filter結(jié)果可以鏈?zhǔn)降剡M行操作,也就是后面可以接多個過濾條件。

Entry.objects.filter(pub_date__year=2006)
Entry.objects.all().filter(pub_date__year=2006)
Entry.objects.filter(blog__name__year="zhangsan")

上面的pub_date__year表示取出DateField類型的pub_date的年,類似的可以取出月__month,日__day。在使用外鍵ForeignKey時可以使用雙下劃線來表示被關(guān)聯(lián)對象的字段。

現(xiàn)在來看一下鏈?zhǔn)竭^濾的例子。

Entry.objects.filter(
...  headline__startswith='What'
... ).exclude(
...  pub_date__gte=datetime.date.today()
... ).filter(
...  pub_date__gte=datetime.date(2005, 1, 30)
... )

首先使用__startswith過濾標(biāo)題以'What'開始的數(shù)據(jù)。然后保留讓發(fā)布日期小于今天的數(shù)據(jù),exclude表示排除條件內(nèi)的那部分?jǐn)?shù)據(jù),條件使用了__gte表示大于當(dāng)前日期,該部分過濾類似于filter后面使用__lte小于。最后也是使用__gte大于一個自定義的日期。

除了上面的過濾條件外,常見的還有__icontains,表示包含該內(nèi)容。

Q

Q是Django自帶的內(nèi)容,用于查詢。主要的用途是在頁面的搜索框中輸入內(nèi)容后臺查詢相應(yīng)的數(shù)據(jù)集。

student = student.filter(Q(name__icontains=search) |
       Q(teacher__name__icontains=search) |
       Q(gender__icontains=search) |
       Q(url__icontains=search))

上述例子常用在一個搜索框可能搜索多個字段的內(nèi)容時,各個過濾條件之間使用“|”進行或者運算。當(dāng)多條件查詢時,各個條件是并運算,使用“&”代替“|”。

Q可以復(fù)制給個變量,有時候我們需要對Q后面的內(nèi)容先做一些處理,如將日期拼湊出來等,這時候可以先把Q賦值給一個變量,然后對變量進行“|”或者“&”操作。

query = Q(name__icontains=search)
query = query | Q(teacher__name__icontains=search)
student = student.filter(query)

以上就是Model怎么在Django中使用,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


當(dāng)前標(biāo)題:Model怎么在Django中使用-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://weahome.cn/article/doogej.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部