2012-03-17 64 views
0

Django/Python新手在这里。django - 过滤模型默认表示

让我们用示例表从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) 

下面是用于访问作者表为例筛选​​语句:

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

,如果我不”什么t在单独的变量中有姓氏和名字吗?如果我只有整个名字,怎么办?我想要做这样的事情:

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

我期待访问对象表示“属性”不知何故。当然,我可以在空间上分割一个名称并按照上面的方式进行查找。但如果不清楚如何分割全名呢?假设我试图分裂像“纽约尼克斯”或“Rip Van Winkle”之类的东西?在第一个例子中,first_name是“纽约”,第二个是“Rip”。

+1

所以......你问哪个问题? – 2012-03-17 16:52:06

+0

我想访问过滤器中的__unicode __(self)“属性”,或者在表格中获取。 – Cromulent 2012-03-17 17:33:35

回答

1

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

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

这就是说,有很多方法:

  1. 如果依靠django-haystack搜索,那么你可以把{{ object }}这是object.__unicode__模型类的模板的结果。然后,您可以通过__unicode__输出启用搜索。

  2. 一个cached_unicode CharField添加到模型中,使用pre_save signal receiver(覆盖save() method)更新self.cached_unicode,那么你就可以过滤(cached_unicode = '富酒吧')

  3. 使用SQL CONTACT(author.first_name ,“”,author.last_name)=“富酒吧”要么Author.objects.raw()要么author_queryset.extra()

+0

感叹。必须有一个更简单的方法。我真的很希望能够做到“a = Author.objects.get(first_name + last_name ='Adrian Holovaty')”,但会得到一个“关键字”错误。 – Cromulent 2012-03-17 17:56:24

+0

你处理了多少个'Authors'?您可以将查询字符串拆分为空格,并对每个可能的姓氏执行多个查找。对于匹配的'Authors',检查__unicode__'表示是否匹配完整的查询名称。它不如单个数据库查找好,但出于您的目的,它可能很好,而且足够快。 – 2012-03-17 18:12:41

+0

我以为你是在寻求一种通用的方式......所以我添加了两个解决方案,它们在你知道__unicode__如何预先构建的情况下工作(即你知道它是名字空间姓氏的连接)。感谢您的反馈意见! – jpic 2012-03-17 18:43:11

0

只需添加一个getbyname方法,你的类拆分名和peforms查询。任务完成。

+0

但是如果你不知道*在哪里分割名字,你怎么分割名字?此外,我无法追踪“getbyname”。 – Cromulent 2012-03-18 14:18:04

+0

@Cromulent直到你写下它才会找到它。至于分裂,那是你设计的。 – Marcin 2012-03-18 16:33:19