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.
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_encodedPUT, 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_itemPydantic'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_itemKısmi güncellemeler özeti¶
Özetle, kısmi güncelleme uygulamak için şunları yaparsınız:
- (İsteğe bağlı olarak)
PUTyerinePATCHkullanın. - Kayıtlı veriyi alın.
- Bu veriyi bir Pydantic modeline koyun.
- Input modelinden, varsayılan değerler olmadan bir
dictüretin (exclude_unsetkullanarak).- 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 (
updateparametresini kullanarak). - Kopyalanan modeli DB'nizde saklanabilecek bir şeye dönüştürün (ör.
jsonable_encoderkullanarak).- 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).
- Bu, modelin
- 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.







