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

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

So long and thanks for all the fish! Part 1 of 2

I have been with the Tech Academy both as a software developer bootcamp student, as well as an employee. After my bootcamp, I was hired first as the live project instructor, and then as Live Project Director. This, I believe, gives me a unique point of view. I have absolutely no regrets and would join the bootcamp again. But there are a number of things I would do differently. What I have learnt as a former student 1. DO NOT WORK PART TIME.   I worked part-time(20-30hrs) during my bootcamp. I was up at 2.30-3.00am every day to work for several hours. I took a short nap, and then I took a 1hr bus ride down to campus. Studied for 7- 9 hours. Took a 1hr bus ride back home. Lather, rinse, repeat. I also had some family obligations. My weekends and half the summer were taken up caring for my young stepdaughter. I was completely exhausted by the end of the bootcamp and I didn't know if I could do more. Learning to program is HARD. You need to be fully focused. I am fortunate because I di...

Fizzbuzz

I was today years old when I found out what fizzbuzz was. Yes, I'm late to the party. I was in an interview where the interviewer mentioned that ordinarily they would ask interviewees in for a round of fizzbuzz challenges, as I know. Actually sir, no, I don't know 👀 But he sounded so certain that I must surely know what it is that I was afraid to say anything so I did what I always do when I panic. Look right back saying not a word. I googled this mysterious fizzbuzz problem:  It looks pretty easy. I don't think he meant this actual problem, but problems like this. Because this problem is way too easy to be an actual problem someone asks in an interview. I decided to work on it for fun:  Yup. Super easy. I wish this is all I were asked in an interview 😄