代码之家  ›  专栏  ›  技术社区  ›  Zach

我可以使用带有字符串连接的Django F()对象吗?

  •  24
  • Zach  · 技术社区  · 14 年前

    我想通过ORM运行django更新,如下所示:

    MyModel.objects.filter(**kwargs).update(my_field=F('my_other_field')+'a string')
    

    3 回复  |  直到 14 年前
        1
  •  42
  •   Daniel Roseman    14 年前

    Django正在将“+”传递给SQL—但是SQL不允许使用“+”进行连接,所以它尝试用数字进行添加。如果使用整数来代替“字符串”,它的作用就是将字符串的整数值相加 my_other_field

    这是不是虫子还值得商榷。这个 documentation for F() objects

    Django支持使用加法、减法、乘法、除法和模运算

    所以有人认为你不应该用它来更新字符串。但这肯定没有文档记录,错误消息“不正确的双精度值”也没有什么帮助。我要开一张票。

        2
  •  122
  •   Daniel Holmes    4 年前

    我也有类似的问题;基本上,我想连接两个字段以获得用户的全名。我用这种方法解决了这个问题(但必须说我使用的是Postgres):

    from django.db.models.functions import Concat
    from django.db.models import F, Value, CharField
    
    AnyModel.objects.filter(**kwargs).annotate(full_name=Concat(F('model__user_first_name'), Value(' '), F('model__user_last_name'), output_field=CharField()))
    

    哪里, F('...') Value('...') 从字面上评估它的参数(在我的例子中,我需要在两者之间放置一个空格) first_name last_name ),和 output_field=... 指定带注释字段的类型(我想成为 CharField ). Django docs about Concat

    希望它能对外面的人有所帮助。干杯

        3
  •  30
  •   Alexey Ruzin    8 年前

    功能 https://docs.djangoproject.com/en/1.9/ref/models/database-functions/#concat

    from django.db.models.functions import Concat
    from django.db.models import Value
    
    MyModel.objects.filter(**kwargs).update(my_field=Concat('my_other_field', Value('a string'))