django - 过滤模型默认表示

时间:2012-03-17 16:45:52

标签: python django

Django / Python新手在这里。

让我们使用本页django书中的示例表:http://www.djangobook.com/en/2.0/chapter10/

class Author(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=40)
    email = models.EmailField()

    def __unicode__(self):
        return u'%s %s' % (self.first_name, self.last_name)

以下是用于访问Author表的示例过滤器语句:

a = Author.objects.get(first_name='Adrian', last_name='Holovaty')

如果我在单独的变量中没有名字和姓氏怎么办?如果我只有整个名字怎么办?我想做这样的事情:

aName = 'Adrian Holovaty'
a = Author.objects.get(Author.self=aName)

我正在寻找以某种方式访问​​该对象表示“属性”。当然,我可以在空间上拆分aName并执行上面的查找。但是,如果不清楚如何拆分整个名字呢?假设我试图分裂像“纽约尼克斯”或“Rip Van Winkle”这样的东西?在第一个例子中,first_name将是“New York”,而在第二个例子中它将只是“Rip”。

2 个答案:

答案 0 :(得分:1)

你不能这样做的原因是__unicode__在Python中评估,使用查询集的SQL选择的数据。

因此,数据库无法预测Python方法__unicode__生成的值。

那说,有很多方法:

  1. 如果您依靠django-haystack进行搜索,则可以将{{ object }}的{​​{1}}放在模型类的模板中。然后,您可以按object.__unicode__输出启用搜索。

  2. 将cached_unicode CharField添加到模型中,使用pre_save signal receiver(覆盖save() method)更新self.cached_unicode,然后可以过滤(cached_unicode ='Foo Bar')

  3. SQL CONTACT使用Author.objects.raw()(author.first_name,'',author.last_name)='Foo Bar'或author_queryset.extra()

答案 1 :(得分:0)

只需在您的类中添加getbyname方法即可拆分名称并执行查询。完成工作。