- 此问题在此处已有答案**:
What is the difference between str and repr?(28个答案)
昨天关门了。
我正在阅读并试图理解django文档,所以我有一个逻辑问题。
这是我的models.py
文件:
from django.db import models
class Blog(models.Model):
name = models.CharField(max_length=255)
tagline = models.TextField()
def __str__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=255)
email = models.EmailField()
def __str__(self):
return self.name
class Post(models.Model):
blog = models.ForeignKey(Blog)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField()
mod_date = models.DateField()
authors = models.ManyToManyField(Author)
n_comments = models.IntegerField()
n_pingbacks = models.IntegerField()
rating = models.IntegerField()
def __str__(self):
return self.headline
每个类中的每个__str__
函数在这里做什么?我需要这些函数的原因是什么?
8条答案
按热度按时间alen0pnh1#
你创建了一个博客模型,一旦你迁移了它,Django会在你的数据库中创建一个包含“name”和“tagline”列的表。
如果您想要与带有模型的数据库交互,例如创建模型的示例并保存它或从DB中检索模型,
打开项目根文件夹中的python交互式环境,方法是:
然后
此外,当您查看管理面板中的模型时,您将看到列出的对象,带有name属性。
问题是,如果不添加该函数,返回结果将如下所示:
所以你不会知道这些对象是什么。识别这些对象的一个更好的方法是通过你设置为name的属性来检索它们。这样你会得到如下结果:
如果你想测试一下,运行
python manage.py shell
并运行:pgpifvop2#
__str__
方法只是告诉Django当它需要打印出一个任意模型的示例时要打印什么。它也可以让你的管理面板,从这个到这个
.
你可以选择在管理面板中显示什么,根据你的选择。可以是一个字段值或默认值或其他东西。
yrefmtwq3#
这将覆盖该类对象的默认名称,类似于
Author:object
,这不是很有帮助。重写它将为对象提供一个更人性化的名称,如Author.name
ovfsdjhp4#
定义字符串(自定义):是一个python方法,当我们使用print/str将对象转换为字符串时调用。它是预定义的,但是可以自定义。将一步一步地看到。假设下面是我们的代码。
输出:
所以在打印的时候我们得到了对象的引用.现在考虑下面的代码.
输出:
所以,这里我们打印的不是对象,而是对象。正如我们所看到的,我们也可以自定义输出。现在,它在django www.example.com文件中的重要性是什么?models.py file?
当我们在www.example.com文件中使用它时,转到管理界面,它将创建对象为"News",否则条目将显示为0x000000006483AC8处的main. topics示例,这看起来不太用户友好。models.py file, go to admin interface, it creates object as "News", otherwise entry will be shown asmain.topics instance at 0x0000000006483AC8 which won't look that much user friendly.
cs7cruho5#
__str__
函数用于添加模型对象的字符串表示,因此告诉Python当我们把一个模型示例转换成字符串时该怎么做。
如果你不提到它,那么它将默认为
USERNAME_FIELD
。因此,在上面的示例中,它会将
Blog
和Author
模型的对象转换为其关联的name
字段,并将Post
模型的对象转换为其关联的headline
字段5jvtdoz26#
Django到处都有
__str__
实现来打印对象的默认字符串表示。Django的默认__str__
方法通常不是很有帮助。它们会返回类似Author object (1)
的结果。但这没关系,因为你实际上不需要到处声明该方法,而只需要在你需要一个好的字符串表示的类中声明。所以,如果需要Author的良好字符串表示而不是Blog,可以仅在Author中扩展该方法:现在,除了Django之外,
__str__
方法在Python中通常非常有用。ca1c2owp7#
当你想返回这个类中的对象时,你会看到
<QuerySet [object(1)]>
这样的东西,但是没有人想看到这样的东西,他们想要一个真正的名字,人们可以理解这个表中到底有什么,所以他们使用了这个函数。zsbz8rwp8#
例如,在**
Person
模型**中定义__str__(),如下所示:然后,定义**
Person
admin**,如下所示:现在,全名显示在**"更改列表"页面**的消息和列表中:
在**"更改"页**中:
在**"删除"页**中:
接下来,如果您没有在**
Person
模型**中定义__str__()
,如下所示:现在,对象名称和ID显示在**"Change List"(更改列表)页面**的消息和列表中:
在**"更改"页**中:
在**"删除"页**中: