Django--數據庫查詢操作


F查詢和Q查詢:

  F查詢:

    Django中提供f()來進行兩個值之間的比較,F()可以在查詢中引用字段來,來比較同一個model實例中的兩個不同的字段

    示例1:查詢賣出數量大於庫存數量的商品

from django.db.models import F
ret1=models.Product.objects.filter(maichu__gt=F('kucun'))
print(ret1)

 

    F可以用來幫我們取到表中某個字段對應的值來當作我們的篩選條件,而不是我認為自定義的常量了,實現了動態比較的效果

    Django支持F對象和F對象之間的加減乘除的取模的操作。基於此可以子啊表中的數值類型進行數學運算

    將每個商品的價格提高50塊

models.Product.objects.update(price=F('price')+50)

 

    如果修改char字段,在后面加上新的字符,這個時候是需要使用Concat操作,並且要和憑借值Value一起使用。

  

  Q查詢:

    filter()等方法中使用逗號隔開的條件的與的關系。如果這時候你需要執行更復雜的查詢(or...),那么就可以使用Q對象了

    示例1:查詢賣出數量大於100或者價格少於100塊的商品:

from django.db.models import Q
models.Product.objects.filter(Q(maichu__gt=100)|Q(price__lt=100))

 

    對條件包裹一層Q的時候,filter就可以支持交叉與或並的比較符

    示例二:查詢庫存數是100並且賣出數量不是0的產品

models.Product.objects.filter(Q(kucun=100)&~Q(maichu=0))

    我們可以組合使用&和|操作符以及使用括號進行分組來編寫任意復雜的Q對象,同時Q對象可以使用~操作符進行取反, 這允許組合正常的查詢和取反(NOT)查詢

    示例三:查詢產品名包含新款,並且庫存數大於60的

models.Product.objects.filter(Q(kucun__gt=60), name__contains="新款")

    查詢函數可以混合使用Q對象和關鍵字參數。所有提供給查詢函數的參數(關鍵字參數或Q對象)都將
“AND”在一起。但是如果出現Q對象,它必須位於所有關鍵字參數的前面

    Q對象的補充:

    from django.db.models import F, Q
    q = Q()
    q.connector = 'or'  # 通過這個參數可以將Q對象默認的and關系變成or
    q.children.append(('price', 188.88))
    q.children.append(('name', '高跟鞋'))
    res = models.Product.objects.filter(q)
    print(res)

 

 

 

事務操作:

  事務的ACID:  

    原子性、一致性、隔離性、持久性

  定義:將多個sql語句操作變成原子性操作,要么同時成功,有一個失敗則在里面回滾都原來的狀態,保證數據的完整性和一致性(NoSQL數據庫對於事務則是部分支持)

from django.db import transaction
    with transaction.atomic():
        # 在with代碼塊中寫事務操作
        models.Product.objects.filter(id=1).update(F('kucun') - 1, F('maichu') + 1)

 

 

 

自定義orm的字段:

class MyCharField(models.Field):
    def __init__(self, max_length, *args, **kwargs):
        self.max_length = max_length
        super().__init__(max_length=max_length, *args, **kwargs)

    def db_type(self, connection):
        return 'char(%s)' % self.max_length


class Product(models.Model):
    info = MyCharField(max_lengh=32)

 

  

only和defer:拿到的是一個對象,兩者之間是相反的

res = models.Product.object.defer("name")
for i in res:
    print(i.name)

res = models.Product.object.only("name")
for i in res:
    print(i.name)

 

 

 

Django中的常用的字段和參數:(https://www.cnblogs.com/Dominic-Ji/p/9203990.html

  1、常用字段

    AutoField:

      int自增列,必須填入參數primary_key=True。當model中如果沒有自增列,則自動會創建一個列名為id的列

    IntegerField:

      一個整數類型,范圍在 -2147483648 to 2147483647。(一般不用它來存手機號(位數也不夠),直接用字符串存,)

    CharField:

      字符類型,必須提供max_length參數, max_length表示字符長度。

  Django中的CharField對應的MySQL數據庫中的varchar類型,沒有設置對應char類型的字段,但是Django允許我們定義新的字段,在上面已經定義了。

 

Django中的幾個比較重要的方法:(https://www.cnblogs.com/Dominic-Ji/p/9213887.html

  update和save之間的區別:

    兩者都是對數據的修改和保存的操作,但是save函數是將數據列的全部數據項全部重新寫了一遍,而update則是針對修改項進行針對的跟新,效率高而且耗時更少。所以以后要是有對數據的修改更推薦使用uodate()

  choices:

choices = ((1, ''), (2,''),(3,'其他'))

gender = models.IntegerField(choices=choices, default=2)


res = models.Product.objects.filter(id=1).first()
print(res.get_gender_display())  # 可以直接查到指定數據中的性別關鍵字

 

 

  

 


免責聲明!

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



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