django models 數據庫操作


django models 數據庫操作

 

創建模型

實例代碼如下

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="學校", 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']
# 對象的默認排序字段,獲取對象列表時使用,升序ordering['time_added'],降序ordering['-time_added']
  verbose_name = "用戶信息"
  verbose_name_plural = verbose_name
  db_table = "student_info"



 

字段類型

  一般數據庫中字段類型大概5種(字符串/數字/浮點型/時間類型/布爾類型),但Django為了在后台admin中可以操作數據庫,同時為了限制在admin中對數據庫的無效操作,Model中設置了很多種數據類型。

1、models.AutoField  自增列=int(11)
  如果沒有的話,默認會生成一個名稱為id的列,如果要顯示的定義一個自增列,必須把該列設置為主鍵(primary_key=True)
2、models.CharField  字符串類型字段 必須加max_length參數
3、models.BooleanField 布爾類型字段=tinyint(1)  不能為空,Blank=True
4、models.ComaSeparatedIntegerField  用逗號分割的數字類型=varchar 繼承CharField,所以必須加max_lenght參數
5、models.DateField  日期字段類型date
  參數auto_now=True表示每次更新都會更新這個時間;參數auto_now_add表示只是第一次創建時添加,之后的更新不再改變
6、models.DateTimeField  日期字段類型datetime  同DateField的參數
7、models.Decimal  十進制小數類型=decimal
  必須指定整數位max_digits和小數位decimal_places
8、models.EmailField  字符串類型(正則表達式郵箱)=varchar  對字符串進行正則表達式驗證
9、models.FloatField  浮點類型=double
10、models.IntegerField  整形
11、models.BigIntegerField 長整形
  integer_field_ranges = {
    'SmallIntegerField': (-32768, 32767),
    'IntegerField': (-2147483648, 2147483647),
    'BigIntegerField': (-9223372036854775808, 9223372036854775807),
    'PositiveSmallIntegerField': (0, 32767),
    'PositiveIntegerField': (0, 2147483647),
  }
12、models.IPAddressField  字符串類型(ip4正則表達式)
13、models.GenericIPAddressField  字符串類型(ip4和ip6是可選的)
  參數protocol可以是:both、ipv4、ipv6  驗證時,會根據設置進行報錯
14、models.NullBooleanField  允許為空的布爾類型
15、models.PositiveIntegerFiel  正Integer
16、models.PositiveSmallIntegerField  正smallInteger
17、models.SlugField  減號、下划線、字母、數字
18、models.SmallIntegerField  數字
  數據庫中的字段有:tinyint、smallint、int、bigint
19、models.TextField  字符串=longtext
20、models.TimeField  時間 HH:MM[:ss[.uuuuuu]]
21、models.URLField  字符串類型,地址正則表達式
22、models.BinaryField 二進制
23、models.ImageField   圖片
24、models.FilePathField 文件

 

CharField(max_length) 字符串
    max_length:長度

BooleanField:布爾類型

DateField: 年月日,日期
DateTimeField:年月日 時分秒
    auto_now_add: 第一次創建的時候賦值
    auto_now:每次修改的時候賦值

AutoField:自動增長

IntegerField 整數

FloatField 浮點數

FileField() 文件

ImageField(upload_to=)  upload_to='' 指定上傳圖片的路徑

models.TextField 存文本信息

models.DecimalField(max_digits=3, decimal_places=1) 固定精度
max_digits 總位數 decimal_places 小數后幾位

 

模型參數
default: 默認
null :設置是否為空,針對數據庫中該字段是否可以為空
blank :設置是否為空,針對表單提交該字段是否可以為空
primary_key:創建主鍵
unique:唯一

blank:

 
         

當blank=True時,說明此處的數據可以不填,默認情況下為False,也就意味着默認情況下,所輸入的數據不得空,blank是和頁面表單 有關,在頁面需要輸入參數的時候,如果在models里面定義了blank=True時,那么這個參數是可以不填寫的,如果是默認的話,如果沒有填寫,則會提示錯誤。

 
         

null:

 
         

當null=True時,也就是說如果沒有填寫數據,此處用NULL來儲存空值,默認的是null=False。

 
         

總結:

 
         

blank主要是用在CharField, TextField,這兩個字符型字段可以用空字符穿來儲存空值。

 
         

 null主要是用在IntegerField,DateField, DateTimeField,這幾個字段不接受空字符串,所以在使用時,必須將blank和null同時賦值為True。

 
         

順便一提,在設置BooleanField為空時,可以使用NullBooleanField型字段。      



使用實例
null=True,blank=True,unique=True,primary_key=True
# id = models.AutoField(primary_key=True) (id 不用寫,django會自動生成一個id屬性) 

 

字段中的參數詳解:
    null                數據庫中字段是否可以為空(null=True)
    db_column           數據庫中字段的列名(db_column="test")
    db_tablespace
    default             數據庫中字段的默認值
    primary_key         數據庫中字段是否為主鍵(primary_key=True)
    db_index            數據庫中字段是否可以建立索引(db_index=True)
    unique              數據庫中字段是否可以建立唯一索引(unique=True)
    unique_for_date     數據庫中字段【日期】部分是否可以建立唯一索引
    unique_for_month    數據庫中字段【月】部分是否可以建立唯一索引
    unique_for_year     數據庫中字段【年】部分是否可以建立唯一索引
    auto_now            更新時自動更新當前時間
auto_now_add 創建時自動更新當前時間 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'), ] )

 

message = models.OneToOneField(to=Message, verbose_name="信息", on_delete=models.CASCADE)
 
        

OneToOneField的第一個參數是被關聯的模型的名稱,第二個參數表示級聯刪除,這個已經在之前的博客里面講過了,當Message數據表里面的數據被刪除后Student里面的數據也隨着被刪除

 

模型操作

 
        

模型成員objects

 
        

Django默認通過模型的object對象實現模型數據查詢

 
        

1. 模型查詢

過濾器

查詢集表示從數據庫獲取的對象集合

 
        

查詢集可以有多個過濾器

 
        

過濾器就是一個函數,基於所給的參數限制查詢的結果

 
        

從SQL角度來說,查詢集合和select語句等價,過濾器就像where條件

Django有兩種過濾器用於篩選記錄 filter : 返回符合篩選條件的數據集 exclude : 返回不符合篩選條件的數據集

多個filter和exclude可以連接在一起查詢

當然還有如下這些過濾器: all() 返回所有數據 filter() 返回符合條件的數據 exclude() 過濾掉符合條件的數據 order_by() 排序 values() 一條數據就是一個字典,返回一個列表

1. 查詢單個數據

get():返回一個滿足條件的對象。如果沒有返回符合條件的對象,會應該模型類DoesNotExist異常,如果找到多個,會引發模型類MultiObjectsReturned異常

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

first():返回查詢集中的第一個對象

obj = models.User.objects.filter(username='yang', password='123456').first()
print(obj.username)
print(obj.password)

 

last():返回查詢集中的最后一個對象

count():返回當前查詢集中的對象個數

exists():判斷查詢集中是否有數據,如果有數據返回True,沒有返回False


2. 限制查詢集

限制查詢集,可以使用下表的方法進行限制,等同於sql中的limit

模型名.objects.all()[0:5] 小標不能為負數

3. 字段查詢

對sql中的where實現,作為方法,filter(),exclude(),get()的參數

語法:屬性名稱__比較運算符 = 值

外鍵:屬性名_id

注意:like語句中使用%表示通配符。比如sql語句查詢 where name like '%xxx%',等同於filter(name_contains='xxx')

4. 比較運算符

contains:是否包含,大小寫敏感 startswith,endswith:以values開頭或者結尾,大小寫敏感 以上的運算符前加上i(ignore)就不區分大小寫了

isnull,isnotnull:是否為空。filter(name__isnull=True)

in:是否包含在范圍內。filter(id__in=[1,2,3])

gt,gte,lt,lte:大於,大於等於,小於,小於等於。filter(age__gt=10)

pk:代表主鍵,也就是id。filter(pk=1)

5. 聚合函數

ggregate()函數返回聚合函數的值

Avg:平均值

Count:數量

Max:最大

Min:最小

Sum:求和

例如: Student.objects.aggregate(Max('age'))

6. F對象/Q對象

F對象:可以使用模型的A屬性與B屬性進行比較 背景:在模型中有兩個字段,分別表示學生成績A與成績B,要對成績AB進行比較計算,就需要使用到F對象。 例如有如下例子,班級中有女生個數字段以及男生個數字段,統計女生數大於男生數的班級可以如下操作: grades = Grade.objects.filter(girlnum__gt=F('boynum'))

F對象支持算數運算

grades = Grade.objects.filter(girlnum__gt=F('boynum') + 10)

Q對象: Q()對象就是為了將過濾條件組合起來

當我們在查詢的條件中需要組合條件時(例如兩個條件“且”或者“或”)時。我們可以使用Q()查詢對象

使用符號&或者|將多個Q()對象組合起來傳遞給filter(),exclude(),get()等函數

Q()對象的前面使用字符“~”來代表意義“非”

例如查詢,學生中不是12歲的或者姓名叫張三的學生,可以如下操作: student = Student.objects.filter(~Q(age=12) | Q(name='張三')) django 模型(model)

模型的對應關系

1:1 一對一 OneToOneField 1:N 一對多 ForeignKey M:N 多對多 ManyToManyField 常見的幾種數據關系,django都提供了很好的支持

1. 一對一

1.1 模型
創建學生的模型:
    class Student(models.Model):
        stu_name = models.CharField(max_length=6, unique=True)
        stu_sex = models.BooleanField(default=0)
        stu_birth = models.DateField()
        stu_delete = models.BooleanField(default=0)
        stu_create_time = models.DateField(auto_now_add=True)
        stu_operate_time = models.DateField(auto_now=True)
        stu_tel = models.CharField(max_length=11)
        stu_yuwen = models.DecimalField(max_digits=3, decimal_places=1, default=0)
        stu_shuxue = models.DecimalField(max_digits=3, decimal_places=1, default=0)

        class Meta:
            db_table = 'stu'

    創建學生拓展的模型:
    class StuInfo(models.Model):

        stu_addr = models.CharField(max_length=30)
        stu_age = models.IntegerField()
        stu = models.OneToOneField(Student)

        class Meta:
            db_table = 'stu_info'

 

使用models.OneToOneField()進行關聯
class StuInfo(models.Model):下是通過班級獲取學生信
    stu = models.OneToOneField(Student)
注意:在數據中關聯字段名稱叫stu_id

 

1.2 通過學生拓展表去獲取學生信息
...
    stuinfo = StuInfo.objects.all().first()
    student = stuinfo.stu
...
注意:通過拓展表去獲取學生的信息的話,語法如下;
    學生拓展表的單條對象.關聯字段,即可獲取到學生表的數據

 

1.3 通過學生獲取人信息1
...
    stu = Student.objects.all().first()
    stuInfo = stu.stuInfo
...
注意:通過學生獲取關聯表的數據的話,語法如下:
    學生對象.關聯的表名,即可獲取到關聯表的數據

 

1.3.1 通過學生獲取人信息2
在關聯字段OneToOneField中加入參數related_name='xxx'
stu = models.OneToOneField(Student,related_name='xxx')
...
    在
    stu = Student.objects.all().first()
    stuInfo = stu.xxx
...
注意:通過學生獲取關聯表的數據的話,語法如下:
    學生對象.關聯的字段中定義的related_name參數,即可獲取到關聯表的數據

 

1.4 設置對應關系的字段為保護模式 :
models.CASCADE                      默認值
models.PROTECT                  保護模式
models.SET_NULL                 置空模式
models.SET_DETAULT          置默認值
models.SET()     刪除的時候吃重新動態指向一個實體訪問對象元素
on_delete = models.PROTECT

...
修改on_delete參數
models.OneToOneField('Student', on_delete=models.SET_NULL, null=True)
...
在刪除student對象的時候,stuinfo的關聯字段會設置為空null=True,如下命令去刪除student的數據:
...
Student.objects.filter(id=1).delete()
...

 

1.5 定義on_delete=models.PROTECT
p =  Student.objects.all().first()
p.delete()

注意:這個時候去執行該業務邏輯的方法的時候會報錯

 

2. 一對多

2.1 模型
...
    定義一個班級類還有學生類,實現一對多的關系:
    先定義班級類
    Class Grade(models.Model):
        g_name = models.CharField(max_length=16)

    定義student
        class Student:
            s_name = models.CharField(max_length=10)
            s_age = models.IntegerField(default=1)
            s_grade = models.ForeignKey(Grade, on_delete=PROTECT)
...

注意:使用models.ForeignKey關聯 獲取對象元素 grade.student_set

 

2.2 獲取數據

語法:通過一獲取多的數據

公式: 一的對象.多的模型_set

然后在獲取數據all(), get(), filter() 等等

如下先通過學生去獲取班級信息:

 stu = Student.objects.first()
    stu.s_grade

 

如下是通過班級獲取學生信息:

 g = Grade.objects.all().first()
    g.student_set.all()   ---> 其中stugrade是定義的related_name參數

 

重點: 定義了related_name字段以后,只能通過related_name去反向獲取數據,在也不能通過_set方法去獲取數據了

2.3 性能對比
獲取班級的學生(通過一獲取多)
...
    1\. 低性能方法:
    g = Grade.objects.all().first()
    s = Student.objects.filter(s_grade=g)

    2\. 高性能方法:
    g = Grate.objects.all().first()
    s = g.student_set.all()
...

 

2.4 練習題
2.5 獲取python班下的所有學生的信息
    gs = Grade.objects.filter(g_name='python')[0]
    allstu = gs.student_set.all()

 

2.6 獲取python班下語文成績大於80分的女學生
 gs = Grade.objects.filter(g_name='python')[0]
    allstu = gs.student_set.filter(stu_yuwen__gte=80)

 

2.7 獲取python班下語文成績超過數學成績10分的男學生
gs = Grade.objects.filter(g_name='python')[0]
    allstu = gs.student_set.filter(stu_yuwen__gte=F('stu_shuxue') + 10)

 

2.8 獲取出生在80后的男學生,查看他們的班級
 gs = Grade.objects.filter(g_name='python')[0]
    allstu = gs.student_set.filter(stu_birth__gte='1980-01-01', stu_birth__lte='1990-01-01')

 

 

3. 多對多

3.1 M:N 模型

定義購物車,用戶的例子實現多對多:

...
1\. 創建用戶模型: class GoodsUser(models.Model): u_name = models.CharField(max_length=32)
...
2\. 創建商品模型:
    class Goods(models.Model):
    g_name = models.CharField(max_length=32)
    g_user = models.ManyToManyField(User)

 

3.2 多對多表結構
多對多關系:
1\. 生成表的時候會多生成一張表(實際會有三張表)
2\. 生成的表是專門用來維護關系的
3\. 生成的表是使用兩個外鍵來維護多對多的關系
4\. 兩個一對多的關系來實現多對多的實現   
5\. 刪除一個表的數據的話,中間關聯表也要刪除相關的信息

3.3 練習題
3.3.1 獲取第一個用戶購買了那些商品
...
    gu = GoodsUser.objects.all().first()
    allstu = gu.goods_set.all()
...

 

3.3.2 獲取指定商品的購買用戶信息
...
    g = Goods.objects.filter(id=1)[0]
    g.g_user.all()
...

 

1.增(create , save):

    from app01.models import *

    #create方式一:   Author.objects.create(name='Alvin')
    
    #create方式二:   Author.objects.create(**{"name":"alex"})
    
    #save方式一:     author=Author(name="alvin")
                    author.save()
                    
    #save方式二:     author=Author()
                    author.name="alvin"
                    author.save()

update_or_create(defaults=None, **kwargs)
defaults 的值不同則創建,相同則更新
例
Member.objects.update_or_create(defaults={'user':1}, others={'field1':1,'field2':1})
#當存在user=1時,則更新,不存在則創建

# django get_or_create()如果有就取這個數據,如果沒有就創建數據

 

2.刪(delete):

#正向    book = models.Book.objects.filter(id=1)

    #刪除第三張表中和女孩1關聯的所有關聯信息
        book.author.clear()        #清空與book中id=1 關聯的所有數據
        book.author.remove(2)  #可以為id
        book.author.remove(*[1,2,3,4])     #可以為列表,前面加*

    #反向
        author = models.Author.objects.filter(id=1)
        author.book_set.clear() #清空與boy中id=1 關聯的所有數據

 

3.改(update和save):

update方法直接設定對應屬性
# models.Tb1.objects.filter(name='seven').update(gender='0')  # 將指定條件的數據更新,均支持 **kwargs
save方法會將所有屬性重新設定一遍,效率低
      # obj = models.Tb1.objects.get(id=1)
        # obj.c1 = '111'
        # obj.save()                                                 # 修改單條數據

 

查詢

# 獲取個數
        #
        # models.Tb1.objects.filter(name='seven').count()

        # 大於,小於
        #
        # models.Tb1.objects.filter(id__gt=1)              # 獲取id大於1的值
        # models.Tb1.objects.filter(id__gte=1)              # 獲取id大於等於1的值
        # models.Tb1.objects.filter(id__lt=10)             # 獲取id小於10的值
        # models.Tb1.objects.filter(id__lte=10)             # 獲取id小於10的值
        # models.Tb1.objects.filter(id__lt=10, id__gt=1)   # 獲取id大於1 且 小於10的值

        # in
        #
        # models.Tb1.objects.filter(id__in=[11, 22, 33])   # 獲取id等於11、22、33的數據
        # models.Tb1.objects.exclude(id__in=[11, 22, 33])  # not in

        # isnull
        # Entry.objects.filter(pub_date__isnull=True)

        # contains
        #
        # models.Tb1.objects.filter(name__contains="ven")
        # models.Tb1.objects.filter(name__icontains="ven") # icontains大小寫不敏感
        # models.Tb1.objects.exclude(name__icontains="ven")

        # range
        #
        # models.Tb1.objects.filter(id__range=[1, 2])   # 范圍bettwen and

        # 其他類似
        #
        # startswith,istartswith, endswith, iendswith,

        # order by
        #
        # models.Tb1.objects.filter(name='seven').order_by('id')    # asc
        # models.Tb1.objects.filter(name='seven').order_by('-id')   # desc

        # group by
        #
        # from django.db.models import Count, Min, Max, Sum
        # models.Tb1.objects.filter(c1=1).values('id').annotate(c=Count('num'))
        # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"

        # limit 、offset
        #
        # models.Tb1.objects.all()[10:20]

        # regex正則匹配,iregex 不區分大小寫
        #
        # Entry.objects.get(title__regex=r'^(An?|The) +')
        # Entry.objects.get(title__iregex=r'^(an?|the) +')

        # date
        #
        # Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
        # Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))

        # year
        #
        # Entry.objects.filter(pub_date__year=2005)
        # Entry.objects.filter(pub_date__year__gte=2005)

        # month
        #
        # Entry.objects.filter(pub_date__month=12)
        # Entry.objects.filter(pub_date__month__gte=6)

        # day
        #
        # Entry.objects.filter(pub_date__day=3)
        # Entry.objects.filter(pub_date__day__gte=3)

        # week_day
        #
        # Entry.objects.filter(pub_date__week_day=2)
        # Entry.objects.filter(pub_date__week_day__gte=2)

        # hour
        #
        # Event.objects.filter(timestamp__hour=23)
        # Event.objects.filter(time__hour=5)
        # Event.objects.filter(timestamp__hour__gte=12)

        # minute
        #
        # Event.objects.filter(timestamp__minute=29)
        # Event.objects.filter(time__minute=46)
        # Event.objects.filter(timestamp__minute__gte=29)

        # second
        #
        # Event.objects.filter(timestamp__second=31)
        # Event.objects.filter(time__second=2)
        # Event.objects.filter(timestamp__second__gte=31)

 

class User(models.Model):
    username = models.CharField(max_length=32,unique=True)
    password = models.CharField(max_length=32)
    age = models.CharField(max_length=32)
    e_mail = models.EmailField()
    create_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.username
    class Meta:
        db_table = 'user'
        verbose_name = verbose_name_plural = '用戶信息表'


# 保存
      user = models.User(username=usr, password=pas, age=age,e_mail= e_mail)
                user.save()

 如圖 時間會自動存儲

記得修改 配置,要不然時間不是正確時間

 

 

 遇到一個 def __str__(self):  是什么作用的問題,

如代碼這樣寫 

class User(models.Model):
    USER_TYPE = (
        (1, '普通用戶'),
        (2, 'VIP'),
        (3, 'SVIP')
    )

    username = models.CharField(max_length=32,unique=True)
    password = models.CharField(max_length=32)
    age = models.CharField(max_length=32)
    e_mail = models.EmailField()
    user_type = models.IntegerField(choices=USER_TYPE)
    create_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True)

    def __str__(self):
        return 'username: %s,password: %s' %(self.username,self.password)

        # return 'username: {},password: {}'.format(self.username, self.password)
    class Meta:
        db_table = 'user'
        verbose_name = verbose_name_plural = '用戶信息表'
# 在終端中執行  python manage.py shell
# from api.models import User
# User.objects.get(id=1)
# 即可返回如下 信息,
# <User: username: wang,password: 123456>

 

class userToken(models.Model):
    user = models.OneToOneField(to='User',on_delete=models.DO_NOTHING)
    # 注意:在數據中關聯字段名稱叫user_id
    token = models.CharField(max_length=60)
    """定義每個數據對象的顯示信息"""
    def __unicode__(self):      # return self.user   使用 def __str__(self):報錯 , 使用 __unicode__ 就 OK了。
        return  self.user

    """定義每個數據對象的顯示信息"""
    # def __str__(self):
    #     return self.token     # 這個返回值是干什么的? 這里 不能寫 user 因為user 對應的是 user_id 是int 類型,服務端會報錯。

    class Meta:
        db_table =  'userToken'
        verbose_name = verbose_name_plural = '用戶token表'
# 在終端中執行  python manage.py shell
# from api.models import userToken
# userToken.objects.get(id=1)
# 即可返回如下 信息,
# <userToken: userToken object (1)>

 

如這樣寫

class userToken(models.Model):
    user = models.OneToOneField(to='User',on_delete=models.DO_NOTHING)
    # 注意:在數據中關聯字段名稱叫user_id
    token = models.CharField(max_length=60)
    """定義每個數據對象的顯示信息"""
    def __unicode__(self):      # return self.user   使用 def __str__(self):報錯 , 使用 __unicode__ 就 OK了。
        return  self.user

    """定義每個數據對象的顯示信息"""
    def __str__(self):
        return self.token     # 這個返回值是干什么的? 這里 不能寫 user 因為user 對應的是 user_id 是int 類型,服務端會報錯。

    class Meta:
        db_table =  'userToken'
        verbose_name = verbose_name_plural = '用戶token表'
# 在終端中執行  python manage.py shell
# from api.models import userToken
# userToken.objects.get(id=1)
# 即可返回如下 信息,
# <userToken: ffc992a78efd6a95c4dc93921a9fc128>

 

 注意:django model中def __str__不能是int  ,使用后會報錯,如上代碼注釋。 def __unicode__(self):  則可以。

 

 

 

 

參考資料:https://code.ziqiangxuetang.com/django/django-queryset-api.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM