Movatterモバイル変換


[0]ホーム

URL:


Ana içeriğe geç
Join theFastAPI Cloud waiting list 🚀
Follow@fastapi onX (Twitter) to stay updated
FollowFastAPI onLinkedIn to stay updated
Subscribe to theFastAPI and friends newsletter 🎉
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor

Body - Güncellemeler

🌐 Yapay Zekâ ve İnsanlar Tarafından Çeviri

Bu çeviri, insanlar tarafından yönlendirilen bir yapay zekâ ile oluşturuldu. 🤝

Orijinal anlamın yanlış anlaşılması ya da kulağa doğal gelmeme gibi hatalar içerebilir. 🤖

Yapay zekâ LLM'ini daha iyi yönlendirmemize yardımcı olarak bu çeviriyi iyileştirebilirsiniz.

İngilizce sürüm

PUT ile değiştirerek güncelleme

Bir öğeyi güncellemek içinHTTPPUT operasyonunu kullanabilirsiniz.

Girdi verisini JSON olarak saklanabilecek bir formata (ör. bir NoSQL veritabanı ile) dönüştürmek içinjsonable_encoder kullanabilirsiniz. Örneğin,datetime değerlerinistr'ye çevirmek gibi.

fromfastapiimportFastAPIfromfastapi.encodersimportjsonable_encoderfrompydanticimportBaseModelapp=FastAPI()classItem(BaseModel):name:str|None=Nonedescription:str|None=Noneprice:float|None=Nonetax:float=10.5tags:list[str]=[]items={"foo":{"name":"Foo","price":50.2},"bar":{"name":"Bar","description":"The bartenders","price":62,"tax":20.2},"baz":{"name":"Baz","description":None,"price":50.2,"tax":10.5,"tags":[]},}@app.get("/items/{item_id}",response_model=Item)asyncdefread_item(item_id:str):returnitems[item_id]@app.put("/items/{item_id}",response_model=Item)asyncdefupdate_item(item_id:str,item:Item):update_item_encoded=jsonable_encoder(item)items[item_id]=update_item_encodedreturnupdate_item_encoded

PUT, mevcut verinin yerine geçmesi gereken veriyi almak için kullanılır.

Değiştirerek güncelleme uyarısı

Bu,bar öğesiniPUT ile, body içinde şu verilerle güncellemek isterseniz:

{"name":"Barz","price":3,"description":None,}

zaten kayıtlı olan"tax": 20.2 alanını içermediği için, input model"tax": 10.5 varsayılan değerini kullanacaktır.

Ve veri, bu "yeni"tax değeri olan10.5 ile kaydedilecektir.

PATCH ile kısmi güncellemeler

Veriyikısmen güncellemek içinHTTPPATCH operasyonunu da kullanabilirsiniz.

Bu, yalnızca güncellemek istediğiniz veriyi gönderip, geri kalanını olduğu gibi bırakabileceğiniz anlamına gelir.

Not

PATCH,PUT'a göre daha az yaygın kullanılır ve daha az bilinir.

Hatta birçok ekip, kısmi güncellemeler için bile yalnızcaPUT kullanır.

Bunları nasıl isterseniz öyle kullanmaktaözgürsünüz;FastAPI herhangi bir kısıtlama dayatmaz.

Ancak bu kılavuz, aşağı yukarı, bunların nasıl kullanılması amaçlandığını gösterir.

Pydantic'inexclude_unset parametresini kullanma

Kısmi güncellemeler almak istiyorsanız, Pydantic modelinin.model_dump() metodundakiexclude_unset parametresini kullanmak çok faydalıdır.

Örneğin:item.model_dump(exclude_unset=True).

Bu,item modeli oluşturulurken set edilmiş verileri içeren; varsayılan değerleri hariç tutan birdict üretir.

Sonrasında bunu, yalnızca set edilmiş (request'te gönderilmiş) veriyi içeren; varsayılan değerleri atlayan birdict üretmek için kullanabilirsiniz:

fromfastapiimportFastAPIfromfastapi.encodersimportjsonable_encoderfrompydanticimportBaseModelapp=FastAPI()classItem(BaseModel):name:str|None=Nonedescription:str|None=Noneprice:float|None=Nonetax:float=10.5tags:list[str]=[]items={"foo":{"name":"Foo","price":50.2},"bar":{"name":"Bar","description":"The bartenders","price":62,"tax":20.2},"baz":{"name":"Baz","description":None,"price":50.2,"tax":10.5,"tags":[]},}@app.get("/items/{item_id}",response_model=Item)asyncdefread_item(item_id:str):returnitems[item_id]@app.patch("/items/{item_id}")asyncdefupdate_item(item_id:str,item:Item)->Item:stored_item_data=items[item_id]stored_item_model=Item(**stored_item_data)update_data=item.model_dump(exclude_unset=True)updated_item=stored_item_model.model_copy(update=update_data)items[item_id]=jsonable_encoder(updated_item)returnupdated_item

Pydantic'inupdate parametresini kullanma

Artık.model_copy() ile mevcut modelin bir kopyasını oluşturup, güncellenecek verileri içeren birdict ileupdate parametresini geçebilirsiniz.

Örneğin:stored_item_model.model_copy(update=update_data):

fromfastapiimportFastAPIfromfastapi.encodersimportjsonable_encoderfrompydanticimportBaseModelapp=FastAPI()classItem(BaseModel):name:str|None=Nonedescription:str|None=Noneprice:float|None=Nonetax:float=10.5tags:list[str]=[]items={"foo":{"name":"Foo","price":50.2},"bar":{"name":"Bar","description":"The bartenders","price":62,"tax":20.2},"baz":{"name":"Baz","description":None,"price":50.2,"tax":10.5,"tags":[]},}@app.get("/items/{item_id}",response_model=Item)asyncdefread_item(item_id:str):returnitems[item_id]@app.patch("/items/{item_id}")asyncdefupdate_item(item_id:str,item:Item)->Item:stored_item_data=items[item_id]stored_item_model=Item(**stored_item_data)update_data=item.model_dump(exclude_unset=True)updated_item=stored_item_model.model_copy(update=update_data)items[item_id]=jsonable_encoder(updated_item)returnupdated_item

Kısmi güncellemeler özeti

Özetle, kısmi güncelleme uygulamak için şunları yaparsınız:

  • (İsteğe bağlı olarak)PUT yerinePATCH kullanın.
  • Kayıtlı veriyi alın.
  • Bu veriyi bir Pydantic modeline koyun.
  • Input modelinden, varsayılan değerler olmadan birdict üretin (exclude_unset kullanarak).
    • Bu şekilde, modelinizdeki varsayılan değerlerle daha önce saklanmış değerlerin üzerine yazmak yerine, yalnızca kullanıcının gerçekten set ettiği değerleri güncellersiniz.
  • Kayıtlı modelin bir kopyasını oluşturun ve alınan kısmi güncellemeleri kullanarak attribute'larını güncelleyin (update parametresini kullanarak).
  • Kopyalanan modeli DB'nizde saklanabilecek bir şeye dönüştürün (ör.jsonable_encoder kullanarak).
    • Bu, modelin.model_dump() metodunu yeniden kullanmaya benzer; ancak değerlerin JSON'a dönüştürülebilecek veri tiplerine çevrilmesini garanti eder (ör.datetime ->str).
  • Veriyi DB'nize kaydedin.
  • Güncellenmiş modeli döndürün.
fromfastapiimportFastAPIfromfastapi.encodersimportjsonable_encoderfrompydanticimportBaseModelapp=FastAPI()classItem(BaseModel):name:str|None=Nonedescription:str|None=Noneprice:float|None=Nonetax:float=10.5tags:list[str]=[]items={"foo":{"name":"Foo","price":50.2},"bar":{"name":"Bar","description":"The bartenders","price":62,"tax":20.2},"baz":{"name":"Baz","description":None,"price":50.2,"tax":10.5,"tags":[]},}@app.get("/items/{item_id}",response_model=Item)asyncdefread_item(item_id:str):returnitems[item_id]@app.patch("/items/{item_id}")asyncdefupdate_item(item_id:str,item:Item)->Item:stored_item_data=items[item_id]stored_item_model=Item(**stored_item_data)update_data=item.model_dump(exclude_unset=True)updated_item=stored_item_model.model_copy(update=update_data)items[item_id]=jsonable_encoder(updated_item)returnupdated_item

İpucu

Aynı tekniği HTTPPUT operasyonu ile de kullanabilirsiniz.

Ancak buradaki örnekPATCH kullanıyor, çünkü bu kullanım senaryoları için tasarlanmıştır.

Not

Input modelin yine de doğrulandığına dikkat edin.

Dolayısıyla, tüm attribute'ların atlanabildiği kısmi güncellemeler almak istiyorsanız, tüm attribute'ları optional olarak işaretlenmiş (varsayılan değerlerle veyaNone ile) bir modele ihtiyacınız vardır.

Güncelleme için tüm değerleri optional olan modeller ileoluşturma için zorunlu değerlere sahip modelleri ayırmak için,Extra Models bölümünde anlatılan fikirleri kullanabilirsiniz.


[8]ページ先頭

©2009-2026 Movatter.jp