在 Django 中通过字符串查找模型实例

Posted

技术标签:

【中文标题】在 Django 中通过字符串查找模型实例【英文标题】:Finding a model instance by string in Django 【发布时间】:2014-06-27 06:10:01 【问题描述】:

我现在有一个函数可以根据匹配模型返回的字符串来查找模型实例。这显然效率不高。我想知道 Django 是否有一种方法可以仅基于字符串而不是通过实例属性过滤来查找模型实例。

def parse_book(book_name):
    for book in Book.objects.all():
        if str(book) == book_name:
            return book

【问题讨论】:

Book.objects.get(name=book_name)Book.objects.filter(book=book_name) 怎么样? 这是一个虚构的例子。如果不进行一些其他模型查找并将它们用作键,则很难在真实模型上进行搜索 然后提供一个具体的例子。 该示例清楚地显示了我想要解决的问题 + 我问的是它是否可能,而不是它是否是最佳编程实践 【参考方案1】:

不,没有办法更有效地做到这一点;您可以使用数据库进行搜索,在这种情况下,您需要搜索模型中的字段,或者您可以使用 Python 搜索返回的行,就像您正在做的那样。

(有些人使用的一种解决方法是 /denormalization/ - 本质上是将字符串与模型本身一起保存在数据库中,然后将其用作索引。)

但是,您的字符串几乎可以肯定与模型中的字段有 一些 关系——理想情况下,它完全由它们决定。如果这是真的,那么您可以解析获得的字符串以确定字段应该是什么,然后根据这些值在数据库中进行查找。

示例代码:

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.CharField(max_length=200)

    def __str__(self):
        return self.title + ": " + self.author

def parse_book(book_name):
    title, author = book_name.split(": ", 1)
    try:
        return Book.objects.get(title=title, author=author)
    except Book.DoesNotExist:
        return None

【讨论】:

是的,字符串确实有一些价值,它由一些外键组成,我需要查找它们中的每一个才能到达可以进行 object.get 调用的地步。跨度> 如果您知道它们代表什么表,您可能不需要查找它们。外键应该被自动索引。数据库擅长连接表。

以上是关于在 Django 中通过字符串查找模型实例的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 模板中通过模型名获取模型

在 Mongodb 中通过 ObjectId 查找有多快?

在 Django Rest 框架 URL 中通过唯一 ID 但不是 PK 获取详细信息

在Django中通过反向存在检查过滤查询集

在 django 中通过管理站点添加对象时出错

如何在 Django 中通过 PUT 请求处理文件上传?