首页 > 解决方案 > Django 复杂查询:组合输出

问题描述

模型.py

class DeviceType(models.Model):
    device_type = models.CharField(max_length=200,unique=True)

    def __str__(self):
        return self.device_type

class Device(models.Model):
    device_type         = models.ForeignKey(DeviceType,to_field='device_type')
    serial_number       = models.CharField(max_length=200,unique=True)
    in_use_by           = models.ForeignKey(User,to_field='username')
    brand               = models.CharField(max_length=200,default="-", null=False)
    model               = models.CharField(max_length=200,default="-", null=False)
    type_number         = models.CharField(max_length=200,blank=True,null=True)
    mac_address         = models.CharField(max_length=200,blank=True,null=True)

以上是我的models.py 文件。我想编写一个查询,以便获得以下格式的输出:

device_type-serial_number-model-brand

标签: djangodjango-models

解决方案


Python处理

我们可以生成一个包含这些字符串的列表,然后让 Python 构造这些字符串,如下所示:

list(map(
    '-'.join,
    Devices.objects.values_list(
        'device_type__device_type',
        'serial_number',
        'model',
        'brand'
    )
)

这将返回 a listof strings。

数据库中处理

我们还可以在数据库中执行连接,然后我们有一个字符串查询集:

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

Devices.objects.annotate(
    text=Concat(
        F('device_type__device_type'),
        Value('-'),
        F('serial_number'),
        Value('-'),
        F('model'),
        Value('-'),
        F('brand')
    )
).values_list('text', flat=True)

推荐阅读