我对Django和Django的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
现在,当我在Python/Djangoshell中运行下面的命令时,它会按预期运行,并带有相关数据。
>>> x = Experience.objects.get( pk = 2 )
>>> x
<Experience: Head Office Technical Office Manager>
以下两个也按预期工作:
>>> y = Prjdesc.objects.get( pk = 11 )
>>> y
<Prjdesc: Description 1>
>>> x.prjdesc_set.all()
<QuerySet [<Prjdesc: Description 1>, <Prjdesc: Description 2>]>
然而,这个表达式不返回任何内容,尽管它应该返回体验类中的相关记录。
>>> y.experience
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'Prjdesc' object has no attribute 'experience'
你能告诉我我在这里缺了什么吗?
正如您在上面的一条评论中提到的:
奇怪的是,它返回了这个;Traceback(最后一次调用(:File"&";,AttributeError中的第1行:"Prjdesc"对象没有属性"experience"。
你只需要写c.o00_key
而不是c.experience
,你与官方文档混淆了,他们给出的字段名也叫experince
。
通常,ForeignKey
是在定义字段时使用smallcase
中的型号名称创建的,默认情况下,related_name
设置为型号名称作为前缀,_set
设置为后缀,因此在您的情况下,它将是prjdesc_set
,或者您可以在字段中使用ForeignKey.related_name
覆盖它。
对于您当前的型号,请使用以下内容:
>>> 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>
注意:此外,最好在
__str__()
方法中使用f stings
,因此在您的模型中。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}"
如果您注意:
c = q.choice_set.create(choice_text='Just hacking again', votes=0)
通过_set有一个呼叫。但一点也不:
q = Question.objects.get(pk=1)
然后是:
q.choice# which will throw the same error
通过使用主模型,可以从辅助模型中获取与其关联的数据。为此,默认情况下会在主模型中创建一个名为secondary model_set的特殊属性(对象(。在您的情况下,例如:
x = Experience.objects.get(pk=1)
x.prjdesc_set.all()
也就是说,我们获得次级模型的所有值,其中初级模型的pk=1(一对多访问(。
如果您需要从主模型和辅助模型中获得值,那么如前所述:
Prjdesc.objects.get(id=1).o00_key.o01_position
在这种情况下,使用get,也就是说,值应该是一,如果期望更多,则应该应用过滤器。