从Django表中查询一对多关系的相关字段
我只是在探索如何解决Django问题,并且在我的Django应用程序中创建了两个模型。从Django表中查询一对多关系的相关字段
from django.db import models
#first model
class Person(models.Model):
name = models.CharField(max_length=40)
email = models.CharField(max_length=100)
title = models.CharField(max_length=100)
image = models.CharField(max_length=200)
def __str__(self):
return self.name
#second model
class Skill(models.Model):
person = models.ForeignKey(Person)
skill = models.CharField(max_length=60)
years = models.CharField(max_length=40)
def __str__(self):
return self.skill, self.person
第一个模型是人和第二模型是技能。现在关系如何是每个人都有很多技能。
现在我可以用数据更新数据库,网站的管理部分也可以正常工作。
在Django的壳,我尝试运行命令:
Skill.object.all()
和我所得到的是以下错误:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\models\query.py", line 235, in __repr__
return '<QuerySet %r>' % data
File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\models\base.py", line 572, in __repr__
u = six.text_type(self)
TypeError: __str__ returned non-string (type tuple)
,或者如果我尝试的命令:
Skill.objects.get(pk=1)
我得到:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "C:\Program Files (x86)\Python36-32\lib\site-packages\django\db\models\base.py", line 572, in __repr__
u = six.text_type(self)
TypeError: __str__ returned non-string (type tuple)
但是,如果我运行一个命令,例如:
Skill.objects.get(skill='Photoshop').person.name
我得到谁拥有技能的人的名字“的Photoshop。”
我想了解我在做什么错在这里;也许我不应该这样用外键查询表?或者,也许我做错了什么。
那么,最后我想查询的是,我想找到具有给定名称或主键的人的所有技能。
__str__
应返回str
。所以改变这样的事情
return self.skill, self.person
到
return "%s-%s" %(self.skill, self.person.name)
哦,谢谢你,我只是想问,如果我不得不保留个人信息,我该如何解决。 –
你__str__
方法返回一个元组(self.skill,self.person),它必须返回这些对象的STR表示。为了实现这个目标,转变:
return self.skill, self.person
到
return "{}, {}".format(self.skill, self.person)
谢谢你解释,现在我明白了:) –
好运探索Django :) –
你确定上面的代码复制粘贴?在返回self.skill结束时是否有'逗号'?然后查询是'Person.objects.get(id =“id”)。skill_set.all()' – itzMEonTV
是代码复制粘贴,并且没有在'return self.skill'结尾处没有逗号:( –
@itzmeontv我很抱歉有一个逗号,实际上我已经删除了逗号并尝试了,但是我猜这个更改并不适用,直到我退出shell并且重新启动它,我想简单地保存文件就足够了。反正我已经更新了代码,它是如何用逗号。 –