【问题标题】:Printing Objects in Django在 Django 中打印对象
【发布时间】:2012-04-14 01:42:20
【问题描述】:

所以我已经成功地将 Django 连接到一个预先存在的数据库(检查、验证和同步),并且我已经创建了一个应用程序和一个项目以及所有这些(我正在阅读 Django 书,我正在阅读章节5),但是当我实际运行它并打印东西时,我得到一个(假设的)错误。在 python 中,我正确导入了我需要的内容 (from myapp.models import Artist),但如果我尝试打印表中的前五行 (print Artist.objects.all()[:5]),我会得到:

[<Artist: Artist object>, <Artist: Artist object>, <Artist: Artist object>, <Artist: Artist object>, <Artist: Artist object>]

为什么它实际上不打印值而不是看起来是占位符的东西?我这里有什么遗漏吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    Django 使用 ORM(对象关系映射器)在 Python 对象和数据库行之间来回转换数据。因此,当您使用它从数据库中获取项目时,它会将其转换为 Python 对象。

    如果该对象没有定义如何将自己显示为文本,Django 会为您完成。 Python 做同样的事情:

    >>> class MyObject(object):
    ...     pass
    ... 
    >>> [MyObject(), MyObject()]
    [<__main__.MyObject object at 0x0480E650>,
     <__main__.MyObject object at 0x0480E350>]
    

    如果您想查看每个对象的行的所有实际值,请使用values

    这是文档中的示例:

    # This list contains a Blog object.
    >>> Blog.objects.filter(name__startswith='Beatles')
    [<Blog: Beatles Blog>]
    
    # This list contains a dictionary.
    >>> Blog.objects.filter(name__startswith='Beatles').values()
    [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]
    

    【讨论】:

    • 好吧,在尝试了jdi的解决方案之后,数据确实出现了,但这更多的是我想要实现的。我希望我能接受这两个答案! D:
    • @GabeC.:我的感情不会受到伤害。 agf 最终提供了您真正需要的信息 :-)
    • 当我们操作没有values() 方法的模型实例时,我们应该如何以简单的方式打印对象的值?
    • values() 用于过滤器,但我希望 get() 方法相同。
    • 是的,请小心,许多 ORM 对象没有 values() 方法,尝试调用它会引发错误。
    【解决方案2】:

    更新:Python 3.x 中,使用 __str__ 而不是 __unicode__

    您看到的是 Artist 模型实例的列表。您的值在 python 对象中。如果你想让这些实例的表示更有帮助,你应该定义 __unicode__ 方法让它们打印一些有用的东西:

    https://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddocs#unicode

    它不是占位符,它是实际对象的表示,转换为 unicode。

    【讨论】:

    • 啊,我们走了。我刚刚为 Artist 定义了 unicode 并再次尝试,它可以工作;谢谢! :D
    【解决方案3】:

    如果你想使用打印方法 覆盖模型本身中的 unicode 方法

     def __unicode__(self):
        return u'%s' % (self.id)
    

    这里是一个示例模型

    class unit(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    def __unicode__(self):
        return u'%s' % (self.name)
    
    print(unit.objects.all())
    [unit: KG, unit: PCs]
    

    【讨论】:

    • 能否请您帮助我了解如何从 [unit: KG, unit: PCs] 中删除模型名称 unit 例如,在 for 循环中我想打印如下:A from KG B from PCs 这里A, B 来自另一个模型,KG, PC 来自模型 unit
    • 这是一个单独的问题而不是评论,我们需要查看更多您的代码。
    猜你喜欢
    • 1970-01-01
    • 2018-12-28
    • 2017-04-30
    • 1970-01-01
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    相关资源
    最近更新 更多