2011-08-31 69 views
1

我有一个模型'Objective',其中通常的方式来引用对象是由unicode方法。只使用对象的Unicode的Django过滤器模型

models.py:

class Objective(models.Model): 
    level = models.IntegerField() 
    strand = models.ForeignKey(Strand) 
    order = models.IntegerField() 
    description = models.TextField() 
    def __unicode__(self): 
     return u'%s%s%s' % (self.level, self.strand.code, self.order) 

    class Meta: 
     unique_together = ("strand", "level", "order") 
     ordering = ['level', 'strand', 'order'] 

在该模型中的一个例子对象将被称为例如6ssm4,在第6级ssm链中的第四个条目。我想通过引用这个unicode字符串来进行查找(比如说从url解析)。

urls.py:

(r'^(?P<objective>[^/]+)/$', 'display_objective'), 

我已经尝试了所有的以下变化在views.py线(不是一次!):

def display_objective(request, objective): 
    theobjective = Objective.objects.get(unicode() = objective) 
    theobjective = Objective.objects.get(self.unicode = objective) 
    theobjective = Objective.objects.get(__unicode__ = objective) 
    theobjective = Objective.objects.get(objective__iexact = objective) 
    theobjective = Objective.objects.get(objective) 
    theobjective = Objective.objects.get(unicode() = objective) 

但如果我去http://localhost:8000/6ssm4/我在错误页面输入错误信息,如“关键字不能是表达式”或“无法解析关键字'自我”,选择是:评估,描述,ID,级别,顺序,链。

这是查找对象的合法方式,还是应该解析关键字?如果它是合法的,那么正确的语法是什么?

回答

0

ORM将过滤器左值(等号左侧的东西)转换为SQL查找术语,这就是为什么它具有有限的语法。您无法将Python函数作为SQL查找术语;数据库对Python一无所知。

一个正确的方式做,这将是你的表中创建一个新的领域,称之为indexlookup,然后做到这一点:

def save(self, *args, **kwargs): 
    self.lookup = self.__unicode__() 
    super(Objective, self).save(*args, **kwargs) 

查找场成为一个预处理成员的表; 您保存一个目标,它的查找就绪版本存储在表中。然后,您可以:

theobjective = Objective.objects.get(lookup = objective) 

你的选择是打破客观成其组成部分和水平,链和订单进行筛选,但是,只有当他们是足够规则的正则表达式的作品。

这是程序员时间与响应与存储的比较(选择二)的典型折衷。在这种情况下,我已经做出了这样的呼吁:程序员的时间和响应性对于存储的考虑更重要。

+0

谢谢。我做了你在新领域所说的话,然后花了几秒钟的时间“为了o的目标:o.save()'而我完成了。可爱的修复。 – nimasmi

+0

这是一个非常聪明的移民!恭喜。你在南方还是手工做过? –

+0

“在南方做”?我不明白。我应该在python shell中完成它,但实际上我暂时修改了我的视图函数,因为它在那里和方便。 – nimasmi