当前位置: 首页 > 面试题库 >

如何在Django中制作/使用自定义数据库功能

夏侯弘量
2023-03-14
问题内容

可以应用于以上以及以下内容:

  • 日期时间对象上的Django F表达式

当然,我也很高兴看到任何其他方法!!

题:

Django /
GeoDjango有一些类似Lower()MakeValid()可以这样使用的数据库函数:

Author.objects.create(name='Margaret Smith')
author = Author.objects.annotate(name_lower=Lower('name')).get()
print(author.name_lower)

有什么方法可以基于现有的数据库功能使用和/或创建自己的自定义数据库功能,例如:

  • Position() (MySQL)
  • TRIM() (SQLite)
  • ST_MakePoint() (带有PostGIS的PostgreSQL)

如何在Django / GeoDjango ORM中应用/使用这些功能?


问题答案:

Django提供了一个Func()表达式来促进在查询集中调用数据库函数:

Func()表达式是涉及数据库函数(如 COALESCELOWER )或聚合(如 SUM) 的所有表达式的基本类型。

关于如何在Django / GeoDjango ORM中使用数据库功能,有2个选项:

为了方便起见,让我们假设模型已命名MyModel,并且子字符串存储在名为的变量中subst

from django.contrib.gis.db import models as gis_models

class MyModel(models.Model):
    name = models.CharField()
    the_geom = gis_models.PolygonField()
  1. 用于Func()直接调用该函数:

我们还将需要以下内容才能使查询正常工作:

* [聚合](https://docs.djangoproject.com/en/1.11/topics/db/aggregation/)为我们数据库中的每个条目添加一个字段。
* [`F()`](https://docs.djangoproject.com/en/1.11/ref/models/expressions/#f-expressions)这允许[在模型字段之间以及模型字段之间执行算术运算。](https://stackoverflow.com/questions/45593440/how-to-execute-arithmetic-operations-between-model-fields-in-django)
* [`Value()`](https://github.com/django/django/blob/master/django/db/models/expressions.py#L620)这将净化任何给定的值([为什么这很重要?)](https://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby-tables-xkcd-comic-work?answertab=votes#tab-top)

查询:

    MyModel.objects.aggregate(
    pos=Func(F('name'), Value(subst), function='POSITION')
)
  1. 创建您自己的扩展数据库功能Func

我们可以扩展Func类以创建我们自己的数据库功能:

    class Position(Func):
    function = 'POSITION'

并在查询中使用它:

    MyModel.objects.aggregate(pos=Position('name', Value(subst)))

GeoDjango附录:

在GeoDjango中,为了导入与GIS相关的功能(如PostGISTransform功能),Func()必须将方法替换为GeoFunc(),但实际上该方法在相同的原则下使用:

class Transform(GeoFunc):
    function='ST_Transform'

推广自定义数据库功能附录:

如果您想创建一个自定义数据库函数(选项2),并且希望能够在不事先知道的情况下将其与任何数据库一起使用,则可以使用Funcas_<database- name>方法, 前提是要使用的函数存在于每个数据库中。数据库

class Position(Func):
    function = 'POSITION' # MySQL method

    def as_sqlite(self, compiler, connection):
        #SQLite method
        return self.as_sql(compiler, connection, function='INSTR')

    def as_html" target="_blank">postgresql(self, compiler, connection):
        # PostgreSQL method
        return self.as_sql(compiler, connection, function='STRPOS')


 类似资料:
  • 问题内容: 如果我要在数据库中定义某些功能(也许是Postgres或任何其他数据库): 我会从SQL中将其称为: 如何从Hibernate调用诸如此类的自定义函数? 问题答案: 如果要在HQL中使用自定义函数,则需要在相应的方言中定义它 看一下PostgreSQLDialect(或其他任何来源)的源代码,您会看到一堆registerFunction()调用。您需要再添加一个:-)-用于您自己的自定

  • 问题内容: 如果我要在数据库中定义某些功能(也许是Postgres或任何其他数据库): 我会从SQL中将其称为: 如何从Hibernate调用诸如此类的自定义函数? 问题答案: 如果要在HQL中使用自定义函数,则需要在相应的方言中定义它 看一下PostgreSQLDialect(或其他任何来源)的源代码,您会看到一堆registerFunction()调用。您需要再添加一个:-)-用于您自己的自定

  • 问题内容: 我正在使用Java中的Smack API连接到XMPP服务器。 我想发送这样的自定义消息包: 我猜想我创建了自己的Packet,并以toXML()方法返回此XML。但这似乎不起作用。 任何帮助,将不胜感激。 问题答案: 您需要定义一个 自定义类 , 该类 应 实现ExtensionElement (由@Flow定义) 可以在此答案中获得产生以下节的非常详细的解释 其中 Reply 是自

  • 本文向大家介绍在django中使用自定义标签实现分页功能,包括了在django中使用自定义标签实现分页功能的使用技巧和注意事项,需要的朋友参考一下 效果演示:   github地址:https://github.com/mncu/django_projects/tree/master/django_projects/pagination_test 本例中总页数为30页,显示页数为12页,当前页的前

  • 问题内容: 我使用atocomplete.jquery插件来建议输入文本,结果得到了这个数组: 当我开始搜索从子字符串开始的东西时,它显示出数组排序如下: 我需要这样的东西: 有任何想法吗? 问题答案: 该插件可能区分大小写。尝试输入而不是。您可能将结果设置为不区分大小写。这个问题可能会有所帮助。 对于上的自定义排序函数,您可以使用任何JavaScript函数并将其作为参数传递给的方法,如下所示:

  • 问题内容: 在 Python 2.x中 ,我可以将自定义函数传递给sort和.sort函数 因为在 我的 语言中,辅音是与此顺序一起出现的 但是在 Python 3.x中 ,看起来我无法传递关键字 有其他选择吗?或者我也应该编写自己的排序函数吗? 注意:我通过使用“ k”,“ kh”等进行了简化。实际字符是Unicode,甚至更复杂,有时在辅音前后都有元音,所以我完成了自定义比较功能,因此这一部分