【问题标题】:Django filter model using only unicode of an objectDjango过滤器模型仅使用对象的unicode
【发布时间】:2011-08-31 15:44:06
【问题描述】:

我有一个模型“目标”,其中引用对象的常用方法是使用 unicode 方法。

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,用于 ssm 链中第 6 级的第四个条目。我想通过引用这个 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、级别、顺序,链”。

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

【问题讨论】:

    标签: django unicode filter get


    【解决方案1】:

    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)
    

    您的替代方法是将目标分解为其组成部分并按级别、链和顺序进行过滤,但这只有在它们对于正则表达式而言足够规则时才有效。

    这是程序员时间与响应能力与存储(选择两个)之间的经典权衡。在这种情况下,我认为程序员的时间和响应能力比存储考虑更重要。

    【讨论】:

    • 谢谢。我对新字段做了你所说的,然后花了几秒钟 for o in objectives: o.save() 完成了。可爱的修复。
    • 这是一个非常聪明的迁移!恭喜。你是在南方做的还是手工做的?
    • “在南方做”?我不明白。我应该在 python shell 中完成它,但实际上我暂时修改了我的视图函数,因为它在那里并且很方便。
    • 您正在 Django 中进行迁移。有一个名为 South 的工具包支持这一点——自动添加字段、模式迁移,然后您会将循环放入数据迁移方法中,以及如何退出的说明。它提供了代码和文档,说明您为使数据库达到当前状态所做的工作——这是专业开发人员的基本技能。
    • 哦,太好了!我安装了,做了一些我想要一段时间但知道会让人头疼的更改,South 只是照顾它。谢谢你,谢谢你,谢谢你。当我看到它迁移得如此轻松时,我真的咯咯地笑了。
    猜你喜欢
    • 2013-03-16
    • 2016-05-17
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多