如何连接 Django 查询集中的两个模型字段?

bvm*_*ode 22 python django concatenation django-queryset django-annotate

考虑一个名为 的表DataTable。它有两个字段:AB

我想返回该表中的所有行,并注释一个名为 的字段,该字段是和字段C的串联。AB

这是我尝试过的:

from django.db.models import CharField, Value
from .models import DataTable

def Test(request):
    query = DataTable.objects.all().annotate(C=Value('A' + '-' + 'B', 
          output_field=CharField()))
    # the rest of the function...
Run Code Online (Sandbox Code Playgroud)

这里的问题是,C实际上每个返回行的字符串文字“A - B”。

A我想连接和字段的值B

小智 31

看起来你需要concat

from django.db.models import CharField, Value
from django.db.models.functions import Concat

query = DataTable.objects.annotate(C=Concat('A', 
          Value('-'), 'B', output_field=CharField()))
Run Code Online (Sandbox Code Playgroud)


Abd*_*du4 12

基本上有两种方法可以实现它。

第一个:
首先,您需要导入以下表达式。

from django.db.models import F, Value, Func
Run Code Online (Sandbox Code Playgroud)

然后,连接字段如下:

ann_concat = Customer.objects.annotate(
            fullName = Func(F('first_name'), Value(' '),F('last_name'), function= 'CONCAT'))
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我将名字和姓氏连接到一个名为 fullName 的新字段中。

第二种: 这种方法比第一种方法短得多,您只需要导入 Concat() 和 Value() 即可使空格起作用。

from django.db.models.functions import Concat


  short_syntax = Customer.objects.annotate(full_name = Concat('first_name',Value(' '),'last_name'))
Run Code Online (Sandbox Code Playgroud)