Python Django 1.8 ArrayField append&;延伸

Python Django 1.8 ArrayField append&;延伸,python,django,postgresql,django-orm,django-1.8,Python,Django,Postgresql,Django Orm,Django 1.8,Django 1.8依赖于PostgreSQL,并在DB级别实现 PostgreSQL的数组字段 但是,我找不到任何关于将项目附加到阵列字段的文档。这显然非常有用,因为它允许更新字段,而无需将其全部内容从数据库传输回数据库 这可能吗?如果没有,将来可能吗?任何我错过的文档的提示都将不胜感激 为了澄清我的问题,这很好: 注意:这是一个幻想代码,我假设它不起作用(我没有尝试过) 目前有没有不使用原始sql的方法来实现这一点?我认为您正在寻找的功能目前还没有实现(也可能没有计划)。许多博士后都有自己的

Django 1.8依赖于PostgreSQL,并在DB级别实现

PostgreSQL的数组字段

但是,我找不到任何关于将项目附加到
阵列字段的文档。这显然非常有用,因为它允许更新字段,而无需将其全部内容从数据库传输回数据库

这可能吗?如果没有,将来可能吗?任何我错过的文档的提示都将不胜感激

为了澄清我的问题,这很好:

注意:这是一个幻想代码,我假设它不起作用(我没有尝试过)


目前有没有不使用原始sql的方法来实现这一点?

我认为您正在寻找的功能目前还没有实现(也可能没有计划)。许多博士后都有自己的特点

我发现新特性最有用的文档来自。其中包括许多这些功能的原始链接

关于前面提到的数组函数,一个重要的注意事项是,它们是函数,可以说是


我希望这些信息是有用的,您可以找到一个很好的解决方案。

注意:操作代码绝对有效。我们只需要保存模型(因为它们只是一个模型字段,而不是关系)。让我们看看:

>>> p = Post.objects.create(tags=[str(i) for i in range(10000)])
>>> p.tags.append("working!")
>>> p.save()
>>> working_post = Post.objects.get(tags__contains=["working!"])
<Post: Post object>
>>> working_post.tags[-2:]
[u'9999', u'working!']
p=Post.objects.create(标记=[str(i)表示范围(10000)内的i)]) >>>p.tags.append(“工作!”) >>>p.save() >>>working\u post=post.objects.get(标记\u包含=[“working!”) >>>工作岗位标签[-2:] [u'9999',u'working!']
深入 Django将
ArrayField
作为python列表获取

您可以使用ArrayField执行列出的所有操作偶数排序

Django将
ArrayField
保存为python列表

这意味着它可以保存python列表的结构和元素。

这样做:

从django.db.models导入F
从django.db.models.expressions导入组合表达式,值
post=post.objects.get(id=1000)
post.tags=CombinedExpression(F('tags'),“| |”,Value(['hello']))
post.save()
或在更新子句中:

Post.objects.filter(在\uu lt=now()-timespan(天=30)上创建)\
.update(tags=CombinedExpression(F('tags'),'| |',Value(['old']))
您可以使用。它支持许多函数,如追加、前置、删除、连接


但是,如果您像我一样使用Django 1.8,那么应该只使用此包中所需的类。这样,您就不必更改数据库后端了。我已经粘贴了所需的类。按照第一个链接中的说明使用它们。

另一个解决方案是使用自定义表达式。我使用Django 1.11和Python3.6(f-strings)测试了以下代码

表达式可用于
update()


谢谢,这正是我所期望/担心的。如果有人提供了一个优雅的代码解决方案,我就不提这个问题了。请检查我的答案。@Danil你说的一切都完全正确。我可能误解了这个问题,但我认为SColvin希望使用Postgres函数,而不是执行更新并将整个数组从Python发送回Postgres。@erik-e,我的错,对不起!这对我没用。我在postgres方面遇到了一个类型错误:它将示例中要追加的值('old')视为类型文本(],而DB中已经存在的值视为类型变化[],然后抱怨它无法对这些类型进行操作。你知道如何解决这个问题吗?我已尝试指定ArrayField(CharField(..)的输出_字段对于值,同样的行为。它实际上并没有附加到DB级别。它将检索数组中的所有元素,执行列表附加,然后将整个列表发送回DB。
>>> p = Post.objects.create(tags=[str(i) for i in range(10000)])
>>> p.tags.append("working!")
>>> p.save()
>>> working_post = Post.objects.get(tags__contains=["working!"])
<Post: Post object>
>>> working_post.tags[-2:]
[u'9999', u'working!']
from django.db.models.expressions import Func

class ArrayAppend(Func):

    function = 'array_append'
    template = "%(function)s(%(expressions)s, %(element)s)"
    arity = 1

    def __init__(self, expression: str, element, **extra):
        if not isinstance(element, (str, int)):
            raise TypeError(
                f'Type of "{element}" must be int or str, '
                f'not "{type(element).__name__}".'
            )

        super().__init__(
            expression,
            element=isinstance(element, int) and element or f"'{element}'",
            **extra,
        )
Post.objects \
    .filter(pk=1) \
    .update(tags=ArrayAppend('tags', 'new tag'))