I’m quite new to Django and practicing Models section of Django by following its official tutorial. I also created a project of my own and try to apply similar concepts.
This is my models.py;
from django.db import models
class Experience(models. Model):
o01_position = models.CharField(max_length=50)
o02_year_in = models.DateField(null=True)
o03_year_out = models.DateField(null=True)
o04_project = models.CharField(max_length=100)
o05_company = models.CharField(max_length=50)
o06_location = models.CharField(max_length=50)
def __str__(self):
return self.o01_position}
class Prjdesc(models.Model):
o00_key = models.ForeignKey(
Experience, on_delete=models.CASCADE)
o07_p_desc = models.CharField(max_length=250)
def __str__(self):
return self.o07_p_desc
class Jobdesc(models.Model):
o00_key = models.ForeignKey(Experience, on_delete=models.CASCADE)
o08_job_desc = models.CharField(max_length=250)
def __str__(self):
return self.o08_job_desc
Now when I run below command in Python/Django shell it runs as expected with the related data.
>>> x = Experience.objects.get( pk = 2 )
>>> x
<Experience: Head Office Technical Office Manager>
Below two also work as expected:
>>> y = Prjdesc.objects.get( pk = 11 )
>>> y
<Prjdesc: Description 1>
>>> x.prjdesc_set.all()
<QuerySet [<Prjdesc: Description 1>, <Prjdesc: Description 2>]>
However this expression does not return anything although it should return its related record in Experience Class.
>>> y.experience
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'Prjdesc' object has no attribute 'experience'
Could you tell me what I am missing here?
Advertisement
Answer
As you mentioned in one of the comments above:
Strangely it returns this; Traceback (most recent call last): File “”, line 1, in AttributeError: ‘Prjdesc’ object has no attribute ‘experience’.
You simply need to write c.o00_key
not c.experience
, you confused with official docs, they give their field name also as experince
.
Generally, ForeignKey
is created using model name in smallcase
while defining field, and the related_name
sets to model name as prefix and _set
as suffix by default, so it will be prjdesc_set
in your case or you can override it by using ForeignKey.related_name
in the field.
With your current models use this:
>>> x = Experience.objects.get(pk=2)
>>> x
<Experience: Head Office Technical Office Manager>
>>> c = x.prjdesc_set.create(o07_p_desc='Description 5')
>>> c
<Prjdesc: Description 5>
>>> c.o00_key
>>> c
<Experience: Head Office Technical Office manager>
Note: Also it’s better to use
f stings
in the__str__()
method, so in your models.py:
class Experience(models.Model):
def __str__(self):
return f"{self.o01_position}"
class Prjdesc(models.Model):
def __str__(self):
return f"{self.o07_p_desc}"
class Jobdesc(models.Model):
def __str__(self):
return f"{self.o08_job_desc}"