显示Django(Reverse)相关表的代码抛出错误



我对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,也就是说,值应该是一,如果期望更多,则应该应用过滤器

相关内容

  • 没有找到相关文章

最新更新