python Django中__str__函数在做什么?[duplicate]

wyyhbhjk  于 2023-01-16  发布在  Python
关注(0)|答案(8)|浏览(166)
    • 此问题在此处已有答案**:

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__函数在这里做什么?我需要这些函数的原因是什么?

alen0pnh

alen0pnh1#

你创建了一个博客模型,一旦你迁移了它,Django会在你的数据库中创建一个包含“name”和“tagline”列的表。
如果您想要与带有模型的数据库交互,例如创建模型的示例并保存它或从DB中检索模型,

def __str__(self):
    return self.name

打开项目根文件夹中的python交互式环境,方法是:

python manage.py shell

然后

from projectName.models import Blog 
Blog.objects.all() # will get you all the objects in "Blog" table

此外,当您查看管理面板中的模型时,您将看到列出的对象,带有name属性。
问题是,如果不添加该函数,返回结果将如下所示:

<QuerySet [<Blog:>,<Blog:>,<Blog:>....]

所以你不会知道这些对象是什么。识别这些对象的一个更好的方法是通过你设置为name的属性来检索它们。这样你会得到如下结果:

<QuerySet [<Blog:itsName>,<Blog:itsName>,<Blog:itsName>....]

如果你想测试一下,运行python manage.py shell并运行:

from projectName.models import Blog

# The below will create and save an instance.
# It is a single step. Copy-paste multiple times.
Blog.objects.create(name="first",tagline="anything")
Blog.objects.all() # check out the result
pgpifvop

pgpifvop2#

__str__方法只是告诉Django当它需要打印出一个任意模型的示例时要打印什么。它也可以让你的管理面板,从这个

  • 注意:对象是如何简单地编号 *

到这个


.

  • 注意:此处为正确的对象名称 *

你可以选择在管理面板中显示什么,根据你的选择。可以是一个字段值或默认值或其他东西。

yrefmtwq

yrefmtwq3#

这将覆盖该类对象的默认名称,类似于Author:object,这不是很有帮助。
重写它将为对象提供一个更人性化的名称,如Author.name

ovfsdjhp

ovfsdjhp4#

定义字符串(自定义):是一个python方法,当我们使用print/str将对象转换为字符串时调用。它是预定义的,但是可以自定义。将一步一步地看到。假设下面是我们的代码。

class topics():
    def __init__(self,topics):
        print "inside init"
        self.topics=topics
my_top = topics("News")
print(my_top)

输出:

inside init
<__main__.topics instance at 0x0000000006483AC8>

所以在打印的时候我们得到了对象的引用.现在考虑下面的代码.

class topics():
    def __init__(self,topics):
        print "inside init"
        self.topics=topics

    def __str__(self):
        print "Inside __str__"
        return "My topics is " + self.topics
my_top = topics("News")
print(my_top)

输出:

inside init
Inside __str__
My topics is News

所以,这里我们打印的不是对象,而是对象。正如我们所看到的,我们也可以自定义输出。现在,它在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.

cs7cruho

cs7cruho5#

__str__函数用于添加模型对象的字符串表示,因此
告诉Python当我们把一个模型示例转换成字符串时该怎么做。
如果你不提到它,那么它将默认为USERNAME_FIELD
因此,在上面的示例中,它会将BlogAuthor模型的对象转换为其关联的name字段,并将Post模型的对象转换为其关联的headline字段

5jvtdoz2

5jvtdoz26#

Django到处都有__str__实现来打印对象的默认字符串表示。Django的默认__str__方法通常不是很有帮助。它们会返回类似Author object (1)的结果。但这没关系,因为你实际上不需要到处声明该方法,而只需要在你需要一个好的字符串表示的类中声明。所以,如果需要Author的良好字符串表示而不是Blog,可以仅在Author中扩展该方法:

class Author(models.Model):
    name = models.CharField(max_length=100)
    ...

    def __str__(self):
        return f'{self.name}'  # This always returns string even if self.name is None

class Post(models.Model):
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    text = models.CharField(max_length=100)

author = Author.objects.create(name='David')
print(author)  # David

post = Post.objects.create(author=author, text='some text')
print(post)  # Post object(1)

现在,除了Django之外,__str__方法在Python中通常非常有用。

ca1c2owp

ca1c2owp7#

当你想返回这个类中的对象时,你会看到<QuerySet [object(1)]>这样的东西,但是没有人想看到这样的东西,他们想要一个真正的名字,人们可以理解这个表中到底有什么,所以他们使用了这个函数。

zsbz8rwp

zsbz8rwp8#

例如,在**Person模型**中定义__str__(),如下所示:

# "models.py"

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
    
    def __str__(self): # Here
        return self.first_name + " " + self.last_name

然后,定义**Person admin**,如下所示:

# "admin.py"

from django.contrib import admin
from .models import Person

@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
    pass

现在,全名显示在**"更改列表"页面**的消息和列表中:

在**"更改"页**中:

在**"删除"页**中:

接下来,如果您没有在**Person模型**中定义__str__(),如下所示:

# "models.py"

from django.db import models

class Person(models.Model):
    first_name = models.CharField(max_length=20)
    last_name = models.CharField(max_length=20)
    
    # def __str__(self): # Here
    #     return self.first_name + " " + self.last_name

现在,对象名称和ID显示在**"Change List"(更改列表)页面**的消息和列表中:

在**"更改"页**中:

在**"删除"页**中:

相关问题