So today's episode is all about non-profit fundraising coaching and we have Jessica Campbell with us here, Jessica is without in the Boons and she is amazing and I can't wait to learn more from you today, Jessica. Before we do that, we'd like to start each and every episode by saying thank you, thank you, thank you to each and every one of our presenting sponsors, you can see their logos on the screen and you can also find them online. So if you haven't done that yet, please do find them. These companies exist to help you do more good. So they literally are here for your cause, for your mission driven goals, please do check them out and say, hey, heard you on the nonprofit show. They are literally here to lean in and pour into you and all of the good that you do in the community. So thank you to our sponsors and thank you to Julia Patrick, CEO of the American nonprofit Academy. You allow me to show up and be my quirky nonprofit self. I'm Jarrett Ransom, also known as the nonprofit nerd CEO of the Raven Group. And with all of that said, it brings us back to Jessica Campbell. And again, thank you so much, Jessica. Welcome. What a joy to be here. Thank you so much to both of you. We've got a J party happening today. I love that. In fact, my whole family were all J.  Yeah, we all have the exact same initials except for the middle initial. And my initial, my middle initial is C. And whenever I would have things monogrammed because I was, I'm 20 years younger than Jarrett. And so I grew up in the age of the 80s where everything was monogram and people would always be like, that's not monogrammed. You got that a JC Penney. And I'd always be like, don't I'm so funny. Oh my gosh. I spent all my babysitting money on, you know, expensive monogramming to no avail. Oh gosh. I needed a coach then you needed a coach then and I'm gonna say I may not have grown up in the same time but I grew up in the southeast where monogramming is still prevalent. And I'm like, I think monogramming exists because maybe like, I don't know, I should say this on air but I'm like, do they forget their name? Is that why it's like everywhere? No, it's custom. It's personal. It's totally custom. It's totally personal. And I want to know how maybe coaching process might get into custom and personal and how the process works. Thank you. Talk to us about you.  What the heck do you offer and why is this called out in the Boons? Great question and I get it a lot. So I'm just Campbell the founder of out in the Boons I'm a small shop that helps mostly small and mid-sized nonprofits raise more money online and in person. I've been a nonprofit fundraiser for it'll be 18 years come this spring. And I started consulting about five years ago. And after a couple years, I was meeting with this executive director who had been the executive director leader of his organization for about 15 years. And he was asking me fundraising one on one questions. Well, how do I follow up Jess and how do I treat it like friends, Jess and how much time in between do I wait to then make the ask again. And I just thought to myself, holy moly no one is teaching this stuff to anyone this guy has been off on his own out in the Boons off on an island for the last 15 years. And I think maybe because I got super lucky and my first few jobs to have the most amazing mentors who really taught me side by side by example, I just got lucky. But as I have now worked with over thousands of different nonprofit leaders and fundraisers I know that that's just not the case. I really struggle and so I don't want nonprofit fundraisers to feel like they are out in the Boons and alone and on their own. I want them to feel supported and educated and informed and up to date and inspired so that they can go out and raise the most amount of money to power the causes that they love. You know, hearing you describe this, I'm totally with you. I get that journey. And one of my things that I think of when I hear you talk about this is that this gentleman had to really open up and feel vulnerable because I would imagine a lot of people have these same questions, but they're afraid to bring them up, because they don't look like they don't know what they're doing. So it makes it even worse because they're not getting that direct information or support whatever you want to call it to move forward. So let's call it paying for the fast pass the the nonprofit sector in so many ways has a real scarcity mindset and let's be honest, no one gets into nonprofit fundraising, you know, because they want to ask people for money I have yet to meet someone that grew up saying I want to be a nonprofit fundraiser someday right. They do it because it's coming. Maybe next maybe next. I think it's, you know, people want to find the cure for cancer they want to rescue all of the street dogs they want to empower the next generation through financial wealth building and to do that you need money. And unfortunately so many nonprofit leaders either feel like I said the scarcity mindset where they feel like they don't have the permission to invest to level up and I say you can either pay the fast pass and hire someone like me that has three, six, 12 times more experience than you, or you can Google yourself to death, and both can get you the results that you're looking for. One is just going to be exponentially faster, and likely more successful. Interesting. I, that is. Go ahead. Well, now, as you say, so I have come in in contact with someone that literally said just that just, you know, and she said, I am Googling and YouTubeing my way through my day. Right, and so that it is so true. Well, we do have a live question and I'm going to toss this out here because I think it's you know it's applicable, but someone wrote in and said that they provide coaching I'm assuming I provide this, and I'm assuming this is coaching for free and very often but how do you monetize this. Yeah, it's, um, you need to start putting a price tag on it I mean, um, I see all the time coaches consultants, especially for the nonprofit people saying I'll do a 20 minute discovery call or this that another and you can do that and if you're good and you can share results. And mostly you can show the transformation of what working with you will look like so you go from step one to step 10 after working with someone like me for example. And again, you can say results give testimonials, you know, for example someone that works with me generally 10 times their investment within 90 days. And I have that because I've done that right. So it's kind of like when you hear that you think, Oh, I can take a chance and not pay someone like Jess and just go for it and maybe lose money, or I can make a small upfront investment and go for it. I think even a lot of nonprofit coaches consultants we come from the nonprofit world. And so we to have a very strong scarcity mindset, unlike our for profit sisters and brothers or entrepreneurs. We ourselves are scared to ask sometimes and that's a lot of mindset work that's a lot of money mindset work I believe in getting coaching myself. I have coaches I have mentors I pay the fast pass all the time.  And there's a place to get paid, and you have to make that choice. I appreciate our viewer that asked that question because it kind of moves me on to our next question and that is, how do you know when you need a coach. It's not just for somebody that's like right out of school starting off or changing jobs I mean, this could be somebody that is what we would call a seasoned professional right. I think you know you're ready for a coach when you're ready for the next level. So if that could be in your earliest stage career but again you want to fast pass it to the director of development level or you want to fast pass it to an executive So I especially think that nonprofit founders need to have a coach because again, you are just guessing if you don't pay someone or invest in someone to mentor you and show you the way because I see so many nonprofits, literally like eating into their savings to fund their organizations and it does not have to be like that I mean there are success stories, near and far like news story which is a nonprofit I very much admire. In five years they have dozens of staff, they're on track to raise $20 million this year, and you know what they surround themselves by the best and the brightest, and they have paid their fast pass towards success and because of that they are literally building hundreds of thousands of homes for people across the world and so if that's the impact you want to make it's up to you how fast or how slow you want to go. And I think when you're ready to level up when you don't know the answers when you're spending more than five minutes on Google, when you're all over Facebook group chats trying to get your answer solved. It's time for a coach so that you can save your time and jump forward. I love this and I just want you to like preach because it is so important. And I feel like, you know, to have a coach, a career coach a professional coach a personal coach. I think needs to be more normalized because we talk often about having a financial coach.  This is normal stuff. Now what about just what do you say to people when they're like, I don't know I feel like if I hire a coach or if I ask my employer to help pay for the coach or even pay fully for the coach. I don't see me as not up for the task or prepared for my for my position. How do you handle that roadblock. I think that you need to go in with clear goals and objectives. So if you are at an organization and let's say you've been tasked with funding your next year's budget which is increasing between 10 to 20%. Which requires you to find 10 to 20 new major gift donors, but you've never asked anyone for more than $1,000 in one sitting. There is a process to find the right donor to cultivate that donor. There's a specific formula for asking that donor and following up. Yeah, you can try it out. I have blog posts after blog posts telling you disaster fire flame stories of how I messed up. But I also have success stories of people literally offering me money before I have to ask them because I do all of that part so well, because I watched my leaders above me. So if you need to come to your boss and say I really want to invest in this course or I really want to hire this coach, you should have a why is it because you need to go fast, you need to save time. Is it because your boss doesn't have the capacity to fully mentor you in the space. Is it because all of you on your team. No one has the expertise maybe you're the expert and grants or graphic designer or marketing and communication but no one on your team has the experience raising $567 million or figure gifts. You need to fill those gaps and again, you can Google your way to that answer, or you can just have someone side by side help you out. So interesting and I appreciate that, you know, Jared asked that question because I think that is something that we, we really struggle with to be vulnerable and to say yeah we don't know but I think there's that bigger issue. You know what you don't know, and I think that's even more frightening so I'm curious to ask you about the measurements because you brought that up right as we started this conversation. What does that look like. Did it tell everyone in fundraising, you need a goalpost, you need to know line in the sand, what worked when you cross that line. And if you didn't make that and then you reevaluate right so going back to the example let's say you want to, you know, write your major gift grant with a funder that you don't know right. So maybe some of your measurements are identified 10 new funders, maybe it's apply to five of those maybe it's get secured grants from three of those. And evaluate after working with a coach or consultant. If you did those things based on what you wrote down is your success because success is different for everyone. Success could be visibility, success could be a feeling of confidence you know success could be money in the bank. And you need to decide that for you, not necessarily anyone else telling you what that means. I think that's interesting. I need to. So we talk often and just you might actually know a newer number but I keep saying 1.8 million there are 1.8 million nonprofits in the US right and so we have so many amazing I like to refer to them as rockstar leaders rockstar talent in our sector and around the world, doing so much good. So how do we find a coach that I'm going to use the word resonates with us right that like, there, I can imagine there's personalities there's you know different skill set so. So what do you share when it comes to like finding that right coach to help you reach those metrics and success. I'm going to try and remember all of the ones I'm thinking in my head, but number one as women, we thrive and I'm sure there's some men that tune into your show as well but for the women, we thrive on peer to peer feedback so men, for example, they want to know all of the data the success the list of things that make this coach super successful right us women, we get we want referrals and testimonials and things like that so if you are looking for someone to do this with you. Go to someone who has maybe been coached before, ask around, ask your peers. For example, I have something called the Rolodex which is my personal kind of black book of experts that I recommend on a daily basis. If you're looking for someone to help you with strategy or to raise a major gift or a grant, etc. There are people out there. I think the other thing you need to think about is who's three to five steps ahead of you right. I would not recommend hiring a coach that is like at your level or even just a little bit above. You need someone that can have a big picture and who has done what you are looking for help doing a bazillion times right. You don't want to hire someone that's maybe just brand new at writing grants but now is advising them or has gotten one six figure grant gift or something or major gift you want someone who's like a little bit more seasoned and there's different coaches at different levels you don't have to be a super experienced coach to be of three to five levels ahead. Something that's really important to me is I am committed to investing at least 50% of my personal development budget into people who identify as non white. So that could be a value of yours as well it doesn't have to be 50%, but if that's the case, you might need to ask people who identify differently than someone like me for recommendations in their network. There are also amazing like we're going to, you know, I host a summit as well I have a network of over 100 nonprofit coaches and experts. They're all over the place hashtags on Instagram I mean I could go on and on but I do think that testing out someone's vibe is important to so check them out on Instagram or if they're on LinkedIn and see what kind of information they're putting out there. Some people who coach have a very kind of like, like a health coach style, go get them like you know they're really almost like cheerleading cheerleader. Other people are really educational other people like lead with a lot of empathy. And so I think you need to know what works for you personally for me. I'm at a place where I don't need like a lot more community because I have such a community that I've built. I need accountability so I need someone that's going to be like, just did you do that thing. Are you, did you follow through where other people really want like, you know, a family wrapped around them that can help them and there's one on one coaches there's group program coaches there's courses. There's something for everyone out there. So that's very interesting so I coach and I also work with coaches right so like I get coaching myself and that's what you said is really like I'm looking for that fast pass and I think that there are so many different ways to really find that fulfillment and what you're are. So when you mentioned community I was like, Oh yeah, I have that group here and I'm thinking of one particular coaching program on and part of, and then when it comes to like that very direct accountability. You know, I have that coach for that as well and so I guess what I'm saying is sometimes it's okay to have more than one. I, if I'm to count right now I have four different people that I'm working within various capacities, someone on one, some in a group, some in like a course kind of hybrid situation so yeah I mean. Again, I am trying to pay my fast pass, I want to be in a very different place professionally in the next, even 18 months and so yeah, I have for right now. And I love that fast pass analogy that's perfect. Yeah, I think that's something that everybody can wrap their heads around and if we ever needed a time to be even discussing this investment it's now with all of the changes that have gone on that are continuing to go forward. For many reasons, not just the pandemic but you know, many, many reasons. And so I think it's a great discussion to have before we let you go and our time is really drawing to a close. You have a really interesting program that you are putting on. And if you could share that with us. I think a lot of our viewers would be interested. Yes. So I am the host of what's called the raise more together summit. It's happening August 25 through 27 the lovely Jared will be joining us as a presenter. This is the third version, and I've welcomed over 1800 folks in the past I think we have nearly 500 folks signed up this round with a few more weeks to go it's totally free and why I built this was, I was searching for an educational business that was cool and diverse, and that focused on the how and not the why everyone knows why you need to raise money, but the step by step how to guide of doing that is where people get stuck. So we have over 25 presenters, we have nine live panel discussions, we have a pitch clinic, we've got hot seat coaching. And when you get in the group, it's just I get messages every single day, it's just a different vibe.  We have prizes we're giving over $2,000 the way and cash prizes this round. And it's three days where you can come and learn from some of the best and the brightest coaches and consultants in our field. So come along. I'm so excited so the summit is, you said August 2526 27 it's free. So it doesn't hurt you to sign up you absolutely should. I think my presentation is on the 27 that I'm also doing a live conversation with you at eight. So that would be eight Pacific time 8am in the morning but Julia knows I'm an early riser I mean I don't. I am my own rooster like it just happened. I know, I know. And then you mentioned the Rolodex which I'm going to do a shameless plug because I'm listed in the Rolodex as well. And in fact, some of our previous guests Julia are also part of this and thinking in particular Sabrina Walker. Maybe if I'm, I'm sorry Sabrina if I'm mixing that up. We have Julie or Donas as she's on there as well so there's a couple of really like, there's several really amazing individuals. And so it doesn't matter where you are in the nation but the Rolodex is there to be of service to you as is this summit so Yes. And how do we learn like, what's the domain that we can get to for the summit information. Yeah, so it's just my website out in the boons dot me backslash virtual slash summit. And it's all there, you can see who's presenting everyone's right there and the more the merrier, it's going to be a really good time. Line up you've got like a VIP package so there's tons of downloads tons of resources. So many I mean like you said, this is really another way to fast pass and fast track your success, your goals not only for you personally but for your organization at large because it's just said we all know why we all need more money. Every mission is critical to financial success. And so, you know, this summit will really be talking about how, and giving you some very, very tangible tools and resources and action steps to get there. And how do we learn about it. Well, here's Jessica's information out in the boons dot me and navigate yourself to her website and you'll be able to see what's going on what's coming forward and and even more discussions about the concept of coaching. Why it's a great investment. Jared, it's even a good investment if your organization doesn't think it's a good investment so don't put up that roadblock. If you're like well but my organization doesn't support that. It's not really a good enough reason to discount it. I work with a lot of individuals that pay for it themselves, right so be on to the organization. You know foot in the bill if you will and that to me tells me this this person is critically engaged and severely invested and that I love I love that and I'm sure just you see you see that as well. But I'd love to see more nonprofits paying for it themselves in their employees so if you're a leader on this call. Have a PD budget for sure. Yeah, and we talked about that about you know like well how do we get this and how much should we you know allocate towards a professional development, you know line item. So I love that you said that and reiterated because it is so important, especially during this great resignation time that we need into our rock star talent, and we help to provide into engage for their success which which in turn is the success of your organization and your community. Because what's more expensive than investing in your employees is turnover. So, it's a really easy another fast pass that people can pay. Absolutely. I love it and I think it's really a mind shift in how we have been looking at our challenges and operating our nonprofits, how we're looking at cultivating that next gen leadership. Those are things that are really important to discuss and I'm going to go ahead and myself and look at your summit I think that sounds great and I think that more of us need to be looking at that and let's face it. We're moving into q for so fast that it's just just like a head spinner, and then we're on to, you know, this next year, and four months away 2022 is four months away. It's like, it's stunning. I mean, I know it intellectually, but when I hear it, it's still so like who. But anyway, hey, if we haven't met I'm Julia Patrick CEO of the American nonprofit Academy been joined today by the amazing nonprofit nerd herself Jared ransom CEO of the Raven group. And we want to make sure that we express our gratitude to all of our presenting sponsors who are here with us, day in and day out where the nation's only national daily show of this kind, and we are marching up on our 350th episode. Oh, tomorrow. Oh, tomorrow. Oh, well join us. Yeah. Are you on the show tomorrow. I think so, I'll have to check my calendar. Oh, so just your 349 what a great. Is that called a prequel. Yeah, yeah, she's answering us in. That's right. That's right. Thank you so much. Those were having me. Well, it's been a lot of fun and we really always love having leadership minds on the nonprofit show. It really helps us to get an idea of what's working what can work better. And how we're navigating this forward because so much change brings so much excitement and challenge and so we need our, our leaders and our thought leaders with us so that we can achieve and we really, really do. And Jared and I I think have been so adamant about that from day one from day literally day one to day 350 that we get thought leaders on who can help us on this journey because we all need to help. Simple as that. Hey, Jared, this has been great. I can't wait to see how you do at the summit. I'm going to sign up and I'm going to be in that audience listening and learning. And as we end today, I want to remind everyone to stay well, so you can do well. We'll see you back here tomorrow everyone. Bye. Bye. Thanks, just


Stories from Parliament, The Gunpowder Plot, Part 2 November the 4th, 1605 After my nightmare, I lay awake knowing that the next day the King and the whole of Parliament would be blown to pieces. I knew exactly what was going to happen. I could see it all in my imagination. But I didn't know about the letter. Somebody had sent a letter to Lord Mont Eagle, telling him not to go to Parliament the next day, warning him that something terrible was going to happen. Tomorrow this Parliament shall receive a terrible blow, and yet they shall not see who hurts them. The letter was not signed. Mont Eagle took it to the King, and from that moment the gunpowder plot was doomed. The captain of the guard ordered his men. Find it. Search every attic and cellar. Open every door in Parliament. Throw open everything from the greatest hall to the smallest cupboard. Shine your torches into every nook and cranny. Go, now! Yes, Captain? There is a threat to the King hidden in Parliament. Find it, sir! Find it tonight. Find it now! Come on! In a cellar under the House of Lords, directly under the hall where the King would have sat the next day, they found Guy Fawkes. There! Seize that man! Find his arms! And hidden under a pile of firewood, they found the 34 barrels of gunpowder. Fawkes had a watch, touch wood and matches in his pocket. They took him to the Tower of London, where the machines of torture and Sir Edward Cook were waiting. He didn't stand a chance. Who were the other traitors, Fawkes? Give us their names, and we will not hurt you. There were no others. I was working alone. Three days. They say he told them nothing for three days. Their names, Fawkes? I was alone. Till on the third day, he broke. Thomas Percy, Thomas Winter, John Wright, Robert Catesby. So now they had my master's name. Robert Catesby put up a fight when the King's men tracked him down, that he was outnumbered. And they shot him, dead. I wept for my master, but at least I knew he had a quick death. The others were not so lucky. I was there at the trial in Westminster Hall. I saw them brought in. Heard them condemned for high treason. Heard to their confessions and the terrible sentences that were passed upon them. A bitter fate awaits any man who is guilty of high treason. These plotters, these conspirators, these vile traitors, shall be dragged through the streets to Old Palace Yard in Westminster. And there they will be hanged! I was there to see Guy Fawkes and three others die in the Old Palace Yard. Right next to the Parliament building they'd wanted to blow up.  They are hanged, drawn and quartered. Their bodies are cut open while they are still alive. I will not tell you of the terrible things I saw that day, but I still shudder when I remember how those men died. I knew what they were planning, you see. If they were all traitors, and so was I. And if they truly deserved that terrible death, then perhaps I did too. And now weak ethics will not be trusted for a hundred years. They will stop us from practicing law or becoming officers in the army. Soon they will stop us from voting. For the next hundred years weak ethics will be blamed for every fire and plague in England. And the plotters, their names are already forgotten. Except one, for the people will remember Guy Fawkes. The King ordered bonfires to be lit to remember the night his Majesty was saved from certain death. And now, on November the 5th every year, people light their fires and burn effigies of Guy Fawkes. The man who witted in the dark with matches and touchwood in his pocket. The man who came within a whisker of changing England, forever.


Good afternoon, Cleveland. As I said, my name is Russell Keith McGee. My day job is a CTO and co-founder of Trades Cloud. We're an Australian software service for tradespeople, plumbers, electricians, carpenters, people like that. But the reason that I'm here today is Django. I've been a core team member for the last 10 years. I'm president of the DSFs since 2011. I served on the technical review board for the 1.7, 1.8 releases and I'm also on the security team. But one of the other roles that I've assumed over the years is as a mentor in the Google Summer of Code. For those who aren't familiar with the program, Google Summer of Code is effectively an internship for college students. Open source projects apply to have students. The students then apply to be a mentor in that particular project. Google very kindly picks up the tab of paying them a stipend in exchange for 12 weeks of contribution to an open source project. The only catch, it needs to be open source and it needs to be done as solo work mentored by an expert from that project. Now this year is actually one of the first years in about six that I haven't been actively mentoring a student. But over the years, the Google Summer of Code has resulted in a number of very large features that have been added to Django. The fact that we've got multiple database support, the ORM aggregation APIs, the systems check framework in 1.7. And in 1.8, a formalized metamodel. Okay, so what is a metamodel and what is metaprogramming? Well, in short, metaprogramming is when you're writing code that can reason about the code that is running. It's especially useful when you're writing generic frameworks because instead of encoding specific situations, you're encoding how to respond to a generic situation. An easy warm-up example. Metaprogramming can be found inside Python itself. Let's say we're going to do some graphics. Okay, so we're going to need a point class to represent the points on our graphics canvas. We're going to do both 2D and 3D representation, so we're going to use some subclassing. Okay, nothing too challenging here. We've got some initialization methods. We take some arguments. We instantiate some objects. We want to be able to output those points in some way. So you write some output methods. You write output point for a two-dimensional point and output point for a three-dimensional point. Okay, nothing too challenging there. And when you run them, you get exactly what you'd expect. But what you really want is rather than having a separate method for each type of point, you really want to have a single method that will take a point of any type and output it appropriately. And that's easy enough to write as well. If you're coming from a language like C++ that doesn't have metaprogramming tools or Java, which has metaprogramming tools that doesn't encourage you to use them that much, you might be inclined to do something like this. You do a class check. Okay, we've got one method called output point. We're going to print the things that we know are common, the X and the Y coordinate. And then if this point that we've been given is an instance of a 3D point, then print the Z coordinate as well. Okay, and that does work. There's nothing wrong with that. But a more pythonic approach is to use metaprogramming. What you do is you can check for a class, if you check for a class that you're only checking for 3D points, that will work. But if you check for properties of the instance, you can adapt to any type as long as it has the right attributes. And so Python provides a tool, provides a built-in method called hasAtra. That is, what you're checking is rather than saying, is this object of this class, you're saying, if this object has the attribute Z, then print it. But what if there's even more attributes? We're going to start modeling Doctor Who now, so we need to start to include time into our XYZ coordinate. So that means we've got to do another hasAtra check, right? Well, no, because again, we can use metaprogramming here. Every Python object has a special attribute named dundadict that contains all the attributes of that instance. So second line there, it says p.dict, that's all the attributes of that instance. We sort those and we iterate over them. For each of them, we're going to print out that attribute, the name of the attribute, and get the value of that attribute off the object p. Now, the thing that's interesting is that that definition will work with any object, not just points. You can point any Python object at that method, and as long as the attribute can be output as a string, that will successfully output a representation of that object. Now, that is admittedly a very much contrived example. You probably wouldn't actually build it that way. You'd actually use the wrapper method or string method on the actual class itself. But it's enough to demonstrate the point. By leveraging metaprogramming, you can do some very powerful things with very little code, and in Python at least, it's fairly easy to understand code. Okay, so what does this metaprogramming mean when we move to Django? Well, it means being able to do some, the same sort of thing we just did with Python objects, but do it with database models. One obvious place this is really useful is model forms. I have a Django model.  I want to be able to display a form to edit an instance of that model. Now, I could define a form instance for each of my models, and then add the fields that I want to edit on those models, or I can use metaprogramming. Using metaprogramming, I can iterate over all the fields on the model, and for each of those fields, add an input that's appropriate for that form. Where's that particularly helpful? In Django's admin. Django's admin allows you to just register a model, and you get an entire admin interface for that model automatically. How's that possible? Because Django's admin uses metaprogramming to introspect the models that form up a Django project, and then generate forms for those objects. Now, of course, you can get a much better, much more customized interface if you spend a whole bunch of time configuring your admin views, but as a first pass administration interface, the metaprogramming approach lets you hit some very big runs very, very easily. Django's admin also requires you to register all the models you want to display on the admin. Now, strictly, you could even avoid this step if you wanted to. Django's app cache is a form of metaprogramming, which allows you to introspect the applications that exist in a project, and then the models that make up that app. So if you were so inclined, it would be possible to write a completely zero configuration admin application for Django. Now, although the Meta API was just one of the benefit for 1.8, that doesn't mean it's a new feature, it's just a new stable feature. Django has had a Meta API since the very beginning. There were some very big changes in the early years, but by the time Django 1.0 was released, the API had pretty much settled down. What did that API look like? Well, if you had a model called myModel, it had an attribute called underscoreMeta, and that object had a bunch of methods on it for introspecting the fields on that model. And there was getField, and getField by name, and get fields with model, and get concrete fields with model, and get all related, many to many objects with model. Looking at that API, you could probably see why we weren't too keen on making it stable. It worked, but it wasn't pretty. Now, what you can't see from just that description are the warts. Some of those methods include fields from the parent. Some don't. Can you tell which ones? As a result, the Meta API was an unofficially stable API. It was an API that formerly wasn't stable, and officially, we reserved the right to change it. But in practice, we knew that enough people would be relying on it, that we wouldn't change it unless there was a really good reason. And the best good reason there is to formalize it, so that we're actually publishing it and making it official stable API. Last year, as part of the Google Summer of Code, Daniel Pirathan took the job of clearing out all that craft that had accumulated in the API, so that we could formally document and publish Jango's Meta API. This is Daniel, graduating from university last year. As you can tell, he's a very serious, very somber, quietly spoken individual. But what was the result of Daniel's work? Well, a new stable Meta API. And it looks a little something like this. The Meta object is unchanged. You still say, here's my model, mymodel.underscoremeta. But now there's just two methods on there. Get field to return a field with a specific name, and get fields to return a list of all fields on that model. You can optionally include the fields from parent models and hidden fields if you're trying to learn something a little bit about your inheritance tree. So the parent fields are the ones coming from your superclasses, and hidden fields are fields that back another field's functionality. For example, the underscore ID field on a foreign key, or fields that have been explicitly hidden, like a foreign key with a related name starting with plus. What you get on top of those two calls is either one or zero to many field objects, which have attributes that then tell you the properties of that field. So is it in a relationship with another model? What is the cardinality of that relationship? What is the other model that it is related to? Was it automatically generated, or is it explicitly defined in a model file? Does it have a direct manifestation as a database column, so is it concrete? Internally, this meant a whole bunch of code churns, so we could replace get all related many to many objects with model with a much, much simplified call. And that much simplified call is effectively just a list comprehension over all fields filtering out the ones that don't have the field properties we want, or the ones that do have the field properties we want. It also meant we gained some new functionality. Previously, generic keys weren't represented in the meta model. They couldn't be, because they were in contrary, but we'd have to make a special case of that particular class to get them into Core's meta representation. Now, we've removed the need for that special case. Any third-party field, including things in Contrib, like all the GIS fields and all the generic key fields, any third-party field can get the same capabilities as a Core Django field and be included in that meta data representation. OK, so why is this a useful thing? Well, to be completely honest, for most day-to-day build-a-blog use cases, it probably isn't. But it is extremely useful when you start looking at larger projects, in particular, anything that starts approaching framework level stuff. A stable meta API means you can now write functions that take a model rather than a model instance as an argument. This means you can write tools that produce high-level functionality that respond to the characteristics of a model and generate functionality based on those characteristics. So here's a practical example where a meta API can be very, very helpful. My commercial day-to-day Django application allows tradespeople, plumbers, electricians, to keep track of the work that they have to complete. Part of that means keeping track of customers. So I've got a customer model. Users can create new customers. And if you raise a piece of work, it's linked to that customer. When you issue an invoice, it's linked to the customer. When you record a payment, it's linked to the customer. So if you ever want to see the full history of a customer with your company, you can easily retrieve all the work, all the invoices, all the payments that relate to that customer. However, this data is being entered by humans. So sometimes you end up with two records for Mr. Smith. What you need is a way to be able to merge two records together. Now, this is easy enough to do. All you need to do is nominate which is the record you're going to retain and which is going to be deleted. And then you update all the foreign key and many, many references to the duplicate instance to point at the original instance instead. Hey, that's easy. So what does this look like? OK, well, we've got some models. We've got a customer model with a name field and a bunch of other data. We have a work order model that has a reference, a foreign key to the work order, and the order ID and a bunch of other interesting details. We also have an invoice and a payment model, both also owned by that customer. And so we can easily define a merge operation for those customers. An existing customer could have work orders. It could have invoices. It could have payments. So given a duplicate customer, we need to find all those related objects, update the foreign key references, and then delete the duplicate. Magic. So now you can merge customers to your heart's content. OK, so time goes by. You decide to add some new functionality to your system, say the ability to raise quotes. So you define a quote model and some views. You roll out that code. And then someone merges a customer record and all quotes related to the dead instance disappear. What happened? Well, the merge mechanism doesn't account for quotes. You updated all the work orders. You updated all the invoices and payments. But the quotes weren't updated. So when you deleted the duplicate customer, there were still quotes related to that customer. So all the duplicate customer's quotes were also deleted. Oops. So how do you fix that? Well, the first obvious solution is to update your merge mechanism, add the extra line you need for quotes. And that will work fine until you then add the appointments model to keep track of each appointment you have with your customer, and so on and so on. What you really need is something that will adapt to any new model as you add it. And how do you do that? You met a program. Rather than encoding the models that need to be updated, you use the meta model to discover all the related models and then update them. That way, when a new model comes along with a foreign key to customer, it will automatically be included in that more merging operation. So what we do here, we iterate through all the fields if the field is a one to many. So it means it's on the remote end of a foreign key relation. And it's auto-created. So it's the far side, the under set side. Get the accessor name, get the attribute of that object, update the customer to be the original, and off you go. Interestingly, though, this doesn't depend on customer. You can actually make it a completely arbitrary merge operation with just one change. Abstracting out the explicit reference to customer, if you notice just at the end there, customer equals original, replace that with a metaprogramming lookup of the name of the field you're being related through. All of a sudden, you've got a completely generic merging two models into one that will work on any Django model. Now, caveat here, this is only working with foreign keys. You also need to reproduce this logic for many to manys and one to manys and so on. But the principle is much the same for those types of fields. So that's a simple practical example of somewhere you might use Meta in your own code. But the real killer app for the Meta API, the reason that I got interested in the project in the first place, is the potential for exposing new data stores into Django. For almost as long as Django has existed, people have been asking the question, how can I use X with Django, where X is some non-relational data store? MongoDB, Google App Engine, React, Cassandra, CouchDB, whatever this year's favorite flavor happens to be. At one time, the Django core team harbored the dream that the ORM was completely data store agnostic. It was an object relational model, which is why you don't do joins, you have a filter. You don't group by, you aggregate. Now, that dream didn't quite pan out. The year after Alex Gaynor did the multi-database project for the Google Summer of Code, he did a second project looking at building a non-relational backend for Django's database API. And it did work, but there were a bunch of problems. So the idea of a database backend for NoSQL was kind of shelved. But the question didn't go away. So, OK, what's the actual use case here? Well, many parts of Django don't care what data store you're actually using, views, URL routing, the caching layer, just go ahead, use MongoDB, use whatever. As long as you're just accessing data, you might as well use the native API provided by your data store. There's no reason to force the square peg of MongoDB into the round hole of a query set. But there are two big pieces of Django that are dependent upon the data store, model forms and the admin. So I put it to you that the question, can I use MongoDB with Django really means, can I get a Django form for my MongoDB model, and can I query and edit my MongoDB data in Django's admin? And if that's the bar you want to set, it's a whole lot easier and a lot more plausible to clear that bar. First question, can I get a Django form for my MongoDB model is right in the sweet spot of Django's meta API. I have an object, what attributes does that object have? What is an appropriate form representation for each of those attributes? These are questions that aren't dependent upon having a relational data store. They can be asked of any model. Even a basic Python object could answer those questions for you. The second question, can I query and edit my MongoDB data in Django's admin, only requires a little bit more information than that. You need to be able to know what models exist in a data store, and you need to know how they're organized. You need to be able to do some basic credit operations on it. These query primitives are a much smaller API than the entire ORM. For the sake of historical consistency, let's call those operations filter, get, and save. If you can provide a duck that quacks the right way, Django's forms an admin don't actually care that it's not actually a Django model under the hood. It just needs to adhere to that basic API contract. So you won't be able to take your arbitrary Django application from PyPI and push it onto an arbitrary Django data store. But let's be honest, that was folly, and it was never going to work in practice. But what you will be able to do is get the benefits of much of Django's tooling while using a non-relational data store. The best part of all this is because it's public supported API now. You can do all these experiments without actually making modifications to core. To prove the point, let's look at a case study. Django Mailer is a proof of concept that Daniel put together during his summer of code to demonstrate that the meta API actually worked. What does it do? It uses Google's Gmail REST API to expose your Gmail mailbox in Django's admin. Now, as a quick, yes. As a quick aside, it's not the same Django Mailer that James Talbot released as part of PINX. Naming things as hard y'all. The code is available on Daniel's GitHub repository. The other caveat is that this example does depend on a couple of small changes to Django itself. Things that are in patches that we're looking at getting into core. It's actually breaking the last of the hard coded exceptions in Django that say this is a model. Just use this out of the box, but it shows what can be done with relatively little effort. How little? It's about 500 lines of code. Now, I haven't got a time to tear down 500 lines of code in the remaining 10 minutes I've got here, but I can give you a whirlwind tour of what you need to do. The following code is heavily edited for clarity. It will not even begin to work as described, but it will give you a flavor of where we're headed. So we start with the manager. You say you want authors.objects.all. Objects is the manager. We need a generic one that will point out Gmail and store your Gmail credentials when you get there. Then we subclass that base manager to provide a mechanism for issuing queries on specific object types. We need one to look at message threads, and we need one to look at specific messages, because they're going to hit on different API entry points in the Gmail API. They're going to return query sets. What about those query sets? Again, we have a base class, a base query that sort of abstracts the idea of calling a REST API, and a base query set to generate those queries. Now, you'll notice here that query set is a subclass of list, because all it's really doing is representing a list of results. You could use your own container if it's useful, but you can just use a base Python list if you need to. And again, we subclass that base class for specific data types. Get thread by ID is the actual Gmail API call there. So when you call get on a thread query set, you're invoking get thread by ID. And we do a similar thing for message query set. When we do, filter is a method that returns a cloned version of itself. So you can start to chain those filter operations. And every time you clone it, every time you filter, you modify it to add additional query parameters. Next, we've got the meta model.  And all we really need to implement is getField and getFields, and the rest all works.  We define a base Gmail model that retains state. And we define a Python meta class that will control the process of object construction. Then we subclass, set a meta class for each of our models, and a default manager. And we're done. Now, you can say thread.objects.get and message.objects.filter and retrieve data from your Gmail instance, assuming you've got your credential set up correctly in your settings file. All that's left then is to register those models in the admin. You have a message inline, works on messages. You have a thread admin. It uses a bunch of inlines and displays the number of messages in each thread. Register that with the admin. Do exactly the same registration processes you would for any other Django model. And you're done. So that's a lot to absorb in a short amount of time. And it does seem probably a little bit overwhelming. Keep in mind, the whole thing is 500 lines of code. And I'm rushing through it to kind of show what is actually possible. But it is just 500 lines of code. And what you end up with is reproducing a limited version of the API that should be familiar to you as Django users, models, managers, query sets, queries, and so on. So here's a call to action. Who's coming to the sprints? Show of hands. There we go. Goodly number. All right. Who's looking for something to work on? Yeah, a goodly number of those. All right. Have I got the project for you? How about one of these? Have you got expertise in a non-relational data store? MongoDB, Google App Engine, Cassandra, React, CouchDB, or anything else that happens to be out there? Why not build a Django method duck for that data store? You'll be able to see your data store in Django's admin, generate forms for that object, off your run. What about more traditional data stores? You could wrap an LDAP store. You could wrap your local email inbox, your file system, even a pool of AWS resources with a Django meta duck, and browse. Even potentially do some light management of your AWS resources in Django's admin. What if you don't like Django's ORM? Well, why not replace it? There's no reason you couldn't make a Django meta duck interface for SQL using SQL Alchemy. So you'd be able to take a SQL Alchemy model as a Django resource, expose it into Django's admin. For most of your business logic, you're using the SQL Alchemy API, because that's the one you prefer. But for convenience and prototyping, you can just drop that model into Django's admin or into a Django form. Now, if you do choose to take on one of those projects, you are going to hit some rough edges. So I will warn you. As I said, Daniel's Django Mailer depends on a couple of patches that haven't been merged into trunk. I can't guarantee that we've identified every single one of the places in forms that admin that you might trip up. There's a couple of places where we probably have made implicit assumptions about the fact that a relational database underpins this application. But if you do find a bug, it's a bug we're interested in fixing. And the more people we have contributing these Django meta-ducks, the more confidence we'll have that we've broken the ORM dependency in model forms and admin. So I hope I've sparked your interest about the possibilities of the meta interface. We probably have time for a couple of questions, or you can grab me over the next couple of days or online. Thank you very much. I can hear crickets. Here they come. How's the documentation for this? Well, pretty good on the basis that there's not much to document. So there's literally two methods and a bunch of attributes. There is actually even some really good documentation for. So you were using the wrong API that wasn't formal. Well, OK, here's how you transform one to the other. So yeah, there is documentation there. It is pretty solid. The documentation of how do you write the Django meta-duck? No. But like I said, the only thing you need to be doing is essentially appearing to be a meta model. So if you implement getField and getFields and a couple others, you're basically there. So do you think there is room in the meta abstraction for some theories that wouldn't make sense in relational database that they do in things like Mongo or other stores? Extending the abstraction to be a little bit more flexible around the edge. I presume you're talking about things like documents as a data type. Exactly. Things like that. Yeah, absolutely. I mean, it's sort of where that is it a one to one? Is it a one to many? Is it a many to many? Is it a blob in some meaningful way? Whatever that. I don't know what that abstraction is. But yeah, I think that there's no reason that we can't have that flag in Django, even if Django itself doesn't use it. But also on top of that, you could set it up in such a way if you've got your MongoDB data type that needs to be able to filter on a particular flag, that flag is not going to be on for any other data type. So you only need to have it in your data store. You can say, get Atra defaulting to false. And any model that doesn't have it will show that up anyway. I don't think this is a new problem that I'm about to ask you to what you've just described. But I'm just looking at the Django documentation. And there's this page on model meta options. And then there's this other page on the model underscore meta API, which is talking about the class options. And I'm really confused what the relationship is between these two things. And is there a possible naming? Yeah, I guess some of that is a little historical. The name of the class options is never surfaced to the end user. It's an internal name. And underscore meta is the only one that is there. If there's something that we need to clean up, it's probably the documentation referring to options. Because it isn't something you should ever really be instantiating. So yeah. But there's also options under the model meta options, which talks about options.abstract. Oh, OK. I see where you're going. I think there's actually two naming conflicts, or potential naming conflicts, for people who are not intimately familiar with how all this is working underneath. Yes, I agree. Yes, there is probably something that can be cleaned up there. I'll talk with you later and see if we may do some suggestions about how that could be cleaned up. Which one we can publish out or take out of the documentation. So the word options, oh, seriously, I can't think of anywhere that's actually surfaced as public API. It's something that is used because that's the name of the class, not because it's actually a name you need to use. So it's a candidate to be deleted anywhere it's being used effectively, so. Thank you. All right, well, I think that's pretty much time as well. So thank you very much.