如何从 Django 中的 __unicode__() 函数中查询数据差异

Posted

技术标签:

【中文标题】如何从 Django 中的 __unicode__() 函数中查询数据差异【英文标题】:How to query data difference from __unicode__() function in Django 【发布时间】:2011-11-06 05:58:37 【问题描述】:

我有一个模型:

class Menu(models.Model):
     menu_id=models.CharField(max_length=30)
     name_vi=models.CharField(max_length=80)
     name_en=models.CharField(max_length=80)

     def get_all_menu(self):
          return Menu.objects.all()

     def __unicode__(self):
          return self.name_vi

     class Admin:pass

当调用 get_all_menu 时,我希望它返回一个包含 3 个字段的菜单模型的二维数组:menu_id、menu_vi、menu_en。但它只返回 name_vi,与 unicode 函数相同。

在这种情况下我可以查询完整的 3 个字段吗?

【问题讨论】:

【参考方案1】:

首先,get_all_menu 方法应该是模型管理器方法,而不是像您拥有的模型方法,因为它是作用于整个表而不是单个行/实例的函数:

class MenuManager(models.Manager):
    def get_all_menu(self):
      return self.objects.all()

class Menu(models.Model):
    objects = MenuManager()

所以你现在可以使用它来获取表格的所有行:

Menu.objects.get_all_menu()

其次unicode函数与查询无关。它只是一个在打印对象时帮助显示对象名称的函数。

第三,查询数据库时为什么要返回一个二维数组?当您执行查询时,您将获得 3 个对象,因此您可以引用它们的所有属性/列:

menus = Menu.objects.get_all_menus()
for menu in menus:
    print menu.menu_id
    print menu.name_vi
    print menu.name_en

【讨论】:

get_all_menu 放入Manager 似乎没有任何意义,因为它与经理的all() 方法相同。我怀疑(当然 OP 没有告诉我们)他/她想在管理员list_display 中使用它,当然只是看到 unicode 表示。 同意,我只是指出了在行级别与表级别操作之间的区别。 太棒了!我得到了它!非常感谢。

以上是关于如何从 Django 中的 __unicode__() 函数中查询数据差异的主要内容,如果未能解决你的问题,请参考以下文章

django模型中的__str__()方法和__unicode__()方法

在 ModelChoiceField Django 中使用 __unicode__ 以外的方法

关于django模型里面的__str__和__unicode

安装djangocms-blog后发生错误:无法从'django.utils .encoding'导入名称'python_2_unicode_compatible'(示

十Django3.0学习之django.utils.encoding未发现 python_2_unicode_compatible包

django.utils.encoding未发现 python_2_unicode_compatible包