【问题标题】:Django model query - how to join string list with F expressionDjango 模型查询 - 如何用 F 表达式加入字符串列表
【发布时间】:2021-08-04 01:34:45
【问题描述】:

我有一个带有数组字段的模型,现在需要一个新的字符串字段来保存具有字符串格式的数组字段的内容。

class MyModel(models.Model):
    array_field = ArrayField(
        models.CharField(
            max_length=255,
            blank=True,
            null=True
        ),
        blank=True,
        null=True
    )
    text_field = models.TextField(null=True, blank=True)

我打算将 F() 与 update() 一起使用,如下所示

MyModel.objects.filter(array_field__isnull=False).update(text_field="; ".join(F("array_field")))

但它给了我以下错误

TypeError: can only join an iterable

F() 是否与 join() 一起使用?

【问题讨论】:

    标签: python python-3.x django django-models


    【解决方案1】:

    来自 django 文档(https://docs.djangoproject.com/en/3.2/ref/models/expressions/):

    F() 对象表示模型字段的值、模型字段的转换值或带注释的列。 它可以引用模型字段值并使用它们执行数据库操作,而无需将它们从数据库中拉出到 Python 内存中

    在你的情况下,当你使用"; ".join(F("array_field"))时,F("array_field")实际上并没有将执行结果放入python的内存中,所以你不能使用join。

    了解如何、为什么以及何时使用 F 将帮助您了解您的问题,Django doc 是一个很好的地方。

    【讨论】:

      【解决方案2】:

      .join(iterable) returns TypeError 每当你在 non-iterable 对象上以integersfloatsNone、.. 调用它时确定 F("array_field")可迭代

      如果可迭代对象包含任何非字符串值,则会引发 TypeError 异常。

      【讨论】:

        猜你喜欢
        • 2014-02-21
        • 2019-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-20
        • 1970-01-01
        • 2015-06-18
        相关资源
        最近更新 更多