Modern APIs with FastAPI and Python Transcripts
Chapter: Building a realistic API
Lecture: Pydantic models
0:00 Now, one thing we can do is we can use our pydantic models to create
0:04 something like this. I'm gonna write it directly here, then we'll
0:06 move it. We're gonna come over here and say there's a class called "location",
0:10 and the location is going to have?
0:12 Well, you guessed it. City. Country that's required but has a default value of
0:17 the US, and a state that is optional here,
0:20 but it has to be a string,
0:22 I guess pretty much everything can be a string.
0:24 So it seems really natural to do something like this.
0:29 Let's come down here and say that this is going to be a location which
0:33 is of this type. Now, we could also put the units in there,
0:37 but to me, units and a location,
0:39 these are not the same. So I'm just gonna leave it separate like this,
0:43 and we've got to do a quick fix up here.
0:44 This will be "location dot" like that.
0:49 Let's see what happens when we try to request it.
0:51 Yes, exactly. So it says this thing is not a valid pydantic model.
0:56 So let's make it one. Base model, import that from pydantic.
1:00 Now it should work for FastAPI, except for I don't think it's gonna work.
1:04 Hmm, something was missing.
1:07 Well, weird. The body was missing something. By default,
1:11 These pydantic models here only come from http post of bodies.
1:17 And that's not what we want.
1:18 We would like to just say give me this,
1:19 like city out of here and give me the country out of the query string
1:23 and so on. So we can set it to a value called a "depends".
1:27 It's kind of a blend of dependency
1:30 injection and other stuff. Let's say that FastAPI does.
1:34 But if we said it the default to depends,
1:36 it'll tell FastAPI to Look in the query string,
1:39 Look at the URL parameters and so on.
1:41 Oh yeah, Look at that. Portland non-metric.
1:44 And if we go back here and refresh it by clicking that, look at that. Portland,
1:49 Oregon, US imperial. And again,
1:52 if we were to, like, set this to well taken on that just takes of the string,
1:56 there's not a good way to omit it because it's all required.
1:59 But if we took away the default value here,
2:02 we don't pass a country, you can see just like before it's doing that validation
2:06 say "no, no, no, that was required". So we can set one of these pydantic models here and say
2:10 it depends, and you can even see that we could have further stuff like I could
2:14 have other, and this is, this is like some kind of recent pydantic model,
2:20 Right? It has other information about it,
2:23 or like nearby I don't know.
2:25 So we can actually nest these pydantic models and get that binding to flow through all
2:30 of them, which is pretty awesome.
2:32 But for now, we're just gonna leave it like this.
2:34 Okay, Now, where do we put this?
2:36 Not here, that is. We just went through all this work to do so
2:39 much organization. Right? Well,
2:42 let's go over here and make a directory called "models"
2:45 and you can bet that we're gonna have more than one by the time we're
2:48 done. It's not directory. Let's open a python file called "location" and in here,
2:54 that's good. Clean this up and we're going to get rid,
3:01 import this. Alright, perfect.
3:04 Don't need that. Just make sure everything's still hanging together.
3:07 Yes, Yes, it is. Perfect.
3:10 Okay, so this is a
3:11 nicer way to organize things. You know,
3:14 to be fair, we really only had in our models three things,
3:17 But you could easily imagine some API that gets more and more complicated.
3:21 You're only getting more value by moving over to these pydantic models.