You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
5.6 KiB
Plaintext

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

00:01 Now that we have our engine stored in our car
00:04 over here as an embedded document,
00:06 the next thing that we need to work on in our car model
00:08 is how do we store the service histories,
00:11 first of all, what kind of data are we going to have in the service history itself.
00:15 So let's go create a class that represents that
00:17 and then we'll figure out what to do with it.
00:20 Again we're going to import MongoEngine, create a class called service history
00:27 and we're going to postpone discussing what goes in there for a minute.
00:32 So this is going to have a date, where this has happened
00:36 either like a create a date or the date when the service was done,
00:39 so let's create a MongoEngine, a date time field and let's even set the default to now,
00:45 so we'll go over here and say—
00:48
00:53 so we want to set this to be a lambda,
00:55 actually we don't need to set it to a lambda,
00:57 we'll just set it to datetime.datetime.now without parenthesis,
01:01 we don't want to call it, we want to just pass that function,
01:04 so we're going to call the now function whenever something gets inserted
01:07 so the date we could even call this like service date if we want,
01:10 but I'm going to stick with date.
01:13 The next thing is let's have some kind of description here
01:15 like just some text, we'll say description,
01:18 it's going to be a mongoengine.StringField,
01:22 and it is just going to be like changed the oil, they had a flat tire,
01:26 a nail was stuck in it, we patched the tire and everything was good,
01:30 something like that, right super simple;
01:32 we have a price, this is how much they paid for the service,
01:35 so it will be a float field, and lastly we care about our customers
01:38 we're primarily a service shop and sometimes we sell our Fearraries
01:43 and sometimes we just service them, but we want our customers to be happy
01:47 and how do you know whether they're happy— we better ask them,
01:50 so let's ask about their customer rating
01:55 and this is going to be an int field, so we're going to set this
01:58 this number is going to go from let's say one to five
02:03 five being the most satisfied, one being the least satisfied.
02:07 Great, so now here's the deal, do we want to embed this into the car
02:12 like we did the engine or do we need to come over here and say something like this
02:17 car_id = mongoengine.ObjectIdField, like this, right
02:23 so we're going to have a relationship over to the car
02:25 or maybe the other way around, on the car, we could have some bunch of ids
02:31 that represent the service history, or there's a bunch of other options.
02:33 So remember when we're designing our documents
02:36 one of the primary questions is in our application
02:39 do we want that embedded data with us, most of the time
02:43 and it turns out because almost all of our data work
02:47 are reason to pull up one of these cars is to actually look at the history of it
02:51 we are going to decide for that reason, that we do
02:54 almost always want the service history associated with the car
02:57 and we don't usually need the service history without the car,
02:59 we need details about the car like the mileage for example.
03:02 How are we going to do all that— let that means
03:06 we probably want to embed the service history as an array into this car;
03:10 the other thing we have to care about is
03:13 is that set bounded and is that bound small?
03:15 You know, a car how much could it possibly get worked on,
03:18 right let's say it gets worked on once a month every month, just ongoing,
03:24 very very unlikely, but that would give us at most a hundred of these service histories
03:28 let's say for some reason that like that upper bound is totally fine with us,
03:32 it's certainly not crazy unbounded where it's going to escape the 16 MB ram
03:36 I mean, how much could one these service histories be, 2 K each, not a huge deal.
03:40 So for all those reasons we are deciding to embed the service history into the car
03:45 so we want to come over here just like we did with engine
03:47 I'll say service history, could be plural could be singular, let's go with singular
03:51 so I'm going to go mongoengine, now it's not an embedded document field
03:54 because this is not a single document, this is a list,
03:57 so instead, is we are going to have an embedded document list field,
04:01 now over here in this one, we said what is the type that is the embedded document
04:05 here what we can say is what things, what type of things are contained in that list
04:10 so this will be a service history, we've got to import that, thank you PyCharm,
04:16 and then we could come over here and we could say
04:19 the default value is like a new array or something, a new list
04:22 but in fact, that's what it already is,
04:24 so the default value for embedded document list is a new list for each entry,
04:29 so we're just going to go with that, that seems totally good to us.
04:32 All right, so now we have this mapped, let's actually go back to our app
04:36 and add the ability to create and insert some histories.
04:40 One thing that we almost forgot, since we decided
04:43 we're going to embed this service history,
04:46 that tells us how we need to treat the base class for the service history.
04:49 So recall for the embedded items,
04:52 this is going to be a mongoengine.EmbeddedDocument,
04:55 if it was going to be standalone and in its own collection it would just be a document.
04:59 There we go, now our service history is ready to go.