【问题标题】:Querying related fields from Django Tables with One to Many Relationship从具有一对多关系的 Django 表中查询相关字段
【发布时间】:2017-03-07 09:07:12
【问题描述】:

我只是在探索如何使用 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

第一个模型是Person,第二个模型是Skill。现在的关系是,每个人都会有很多技能。

现在我可以用数据更新数据库,网站的管理部分也可以正常工作。

在 Django Shell 上,我尝试运行命令:

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”的人的名字。

我试图了解我在这里做错了什么;也许我不应该以这种方式使用外键查询表?或者我做错了什么。

嗯,最后我想查询的是,我想找到具有给定名称或主键的人的所有技能

【问题讨论】:

  • 你确定上面的代码是复制粘贴的吗? return self.skill 末尾有comma 吗?那么查询是Person.objects.get(id="id").skill_set.all()
  • 是的代码是复制粘贴的,不是return self.skill末尾没有逗号:(
  • @itzmeontv 我很抱歉有一个逗号,实际上我已经删除了逗号并尝试了,但我想更改不适用,直到我退出 shell 并重新启动它,我想只是保存文件就足够了。无论如何,我已经用逗号更新了代码。
  • 所以我现在将return self.skill, self.person 更改为return self.skill 并且它工作正常

标签: django python-3.x python-3.6


【解决方案1】:

__str__ 应该返回一个str。所以改变这样的东西

return self.skill, self.person

return "%s-%s" %(self.skill, self.person.name)

【讨论】:

  • 哦,谢谢,我只是想问,如果我还必须保留此人的信息,我该如何解决。
【解决方案2】:

您的__str__ 方法返回一个元组(self.skill,self.person),它必须返回这些对象的str 表示。为了实现这一点,改变:

return self.skill, self.person 

return "{}, {}".format(self.skill, self.person)

【讨论】:

  • 谢谢你的解释,现在我明白了:)
  • 祝你探索 Django 好运 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-23
相关资源
最近更新 更多