Skip to main content

Querying tables linked via foreign keys

A student was trying to display data from both her parent and child tables that were linked by foreign key. I played around with it and found 2 ways I can do this. 

The models(I took out most of the fields for this post because it was unnecessary for this explanation):
class Owner(models.Model):
owner_fname = models.CharField('First Name', max_length=50, blank=False, null=False)

Owner=models.Manager()


class PlayTime(models.Model):
dog_name = models.CharField(max_length=50, blank=False)
owner = models.ForeignKey(Owner, on_delete=models.CASCADE, blank=False, null=False)

PlayTime=models.Manager()

This first method involves multiple queries to the database. The second method involves a single query, and fewer lines of code. It is the equivalent of an inner join. I didn't include the context and the return statement, which are necessary, of course, if you plan to pass these variables on to the template.
def details(request, pk):
#============== METHOD 1: query database multiple times ===============#
get_posts = get_object_or_404(PlayTime, pk=pk)
print(get_posts.owner_id)
lookup_id = get_posts.owner_id #get foreign key
get_owner= get_object_or_404(Owner, pk= lookup_id) #pass foreign key to second db query
print(get_owner.owner_fname)

# ============== METHOD 2: inner join =================#
details = PlayTime.PlayTime.select_related('owner').get(id=pk)
print(details.owner.owner_fname)
# print(details.values())
 If you wanted to join all the data in both tables, you can also do so and get a queryset. In that case, you would just type: 
details = PlayTime.PlayTime.select_related('owner')

Disclaimer: I'm not sure if this is the best way to do this, but this is what I figured out from looking at documentation online. 

Comments

Popular posts from this blog

Certified CSS Surgeon

I've just been certified as a top notch CSS Surgeon 😹😹😹. Codepip has just officially launched and they're offering CSS Surgeon for free until the 1st of September. I've already finished Flexbox Froggy(Free) and Grid Garden(Also free). I really do enjoy the CSS games on this website. It has helped me better understand CSS. There is still so much to learn. I've been trying to create a simple language learning website and it has been a struggle. I'm using the most simple website layout and yet it's just kicking my butt(I'm looking at you Nav bar). I hope to add some Javascript to make it more interactive in the future. At one point I really wanted to throw in the towel because it felt like I would never get this. It's hard not to give up when there are so many hurdles to cross. Can I really be confident at coding after just a 6 month bootcamp?

Portfolio on GitHub

As part of the bootcamp, I've been building a portfolio website based on a template provided by the school. Honestly, I hate the template. It is hideous. But I guess it's a great starting point for someone who is unsure about what to do. It was also an opportunity for me to practice publishing a website online. Unfortunately, I had to pay for a webhosting service. After submitting my third update to my portfolio website, one of the instructors suggested that I could use GitHub Pages instead. *mindblown* This is amaziiiiing. And it's so simple. When I finally get down to creating my own portfolio from scratch, I am definitely going to put it up on GitHub instead. Also, speaking of GitHub, I'm slowly understanding how GitHub functions. It is taking me awhile. Especially because I don't use many of the functions that are available. I look forward to learning more and becoming a GitHub extraordinaire :D JK

Deviants in a normal world

It's definitely been a bit since I've seen this graphy. Anyone who has learnt about standard deviation knows this graph. Standard Deviation Standard deviation shows us how spread out all the values in a set are from the mean. The higher the standard deviation, the more spread out the values are over a wider range and the flatter this curve. In a normal distribution, most values are within 1 standard deviation from the mean(the green part of the graph). Apparently NumPy can calculate standard deviation too! import numpy numSet = [ *lots of numbers* ] numSetStdDev = numpy.std(numSet) Variance The variance also indicates how spread out the values in a set are. It measures the average degree to which each value differs from the mean. variance = standard deviation ^2 import numpy numSet = [ *lots of numbers * ] numSetVar = numpy.var(numSet) Source:  https://www.w3schools.com/python/python_ml_standard_deviation.asp