在 Django ORM 中转换复杂的 SQL 查询
Convert a complex SQL query in Django ORM
在我的项目中,我有一个 SQL 查询,用于从两个表中提取一些结果,例如:
SELECT
read_date, unit_id, device_id, proj_code, var_val
FROM
public.api_site_varsresults AS SV, public.api_site_results AS SR
WHERE
(read_date >= '2021-06-21' AND read_date <= '2021-06-24') AND SV.id_res_id = SR.id
这里是我的模型:
class Results(models.Model):
id = models.AutoField(primary_key=True)
device = models.ForeignKey(Device, null=True, on_delete=models.SET_NULL)
proj_code = models.CharField(max_length=400)
res_key = models.SlugField(max_length=80, verbose_name="Message unique key", unique=True)
read_date = models.DateTimeField(verbose_name="Datetime of vals readings")
unit = models.ForeignKey(ModbusDevice, null=True, on_delete=models.SET_NULL)
def __str__(self):
return self.device
class Meta:
indexes = [
models.Index(fields=['device', 'unit', 'proj_code']),
]
class VarsResults(models.Model):
id = models.AutoField(primary_key=True)
id_res = models.ForeignKey(Results, related_name="mainres", on_delete=models.CASCADE)
var_id = models.ForeignKey(ModbusVariable, null=True, on_delete=models.SET_NULL)
var_val = models.CharField(max_length=400, blank=True)
var_hash = models.CharField(max_length=400)
def __str__(self):
return self.var_hash
class Meta:
indexes = [
models.Index(fields=['id_res', 'var_id']),
]
我想在使用 ORM 的 Django 项目中使用此查询,但我尝试这样做:
varsresults.objects.filter(<conditions>).fields(<fields>)
但不正确,我不知道如何 link 两个表,select 特定字段并在 django ORM
中针对该条件进行过滤
有人可以帮我吗?
非常感谢
曼纽尔
您的 Django 查询将是:
start_date = datetime.date(2021, 06, 21)
end_date = datetime.date(2021, 06, 24)
var_results = VarsResults.objects.filter(
id_res__read_date__range=(start_date, end_date)
).select_related(
"id_res"
).values(
"id_res__read_date",
"id_res__unit_id",
"id_res__device_id",
"id_res__proj_code",
"var_val",
)
或者在查询期间访问字段而不获取值:
start_date = datetime.date(2021, 06, 21)
end_date = datetime.date(2021, 06, 24)
var_results = VarsResults.objects.filter(
id_res__read_date__range=(start_date, end_date)
).select_related(
"id_res"
)
read_date = var_results.id_res.read_date
unit_id = var_results.id_res.unit_id
阅读 关于 select_related
的连接。
阅读 here .values()
以及如何访问相关字段。
参见 here __range
。
在我的项目中,我有一个 SQL 查询,用于从两个表中提取一些结果,例如:
SELECT
read_date, unit_id, device_id, proj_code, var_val
FROM
public.api_site_varsresults AS SV, public.api_site_results AS SR
WHERE
(read_date >= '2021-06-21' AND read_date <= '2021-06-24') AND SV.id_res_id = SR.id
这里是我的模型:
class Results(models.Model):
id = models.AutoField(primary_key=True)
device = models.ForeignKey(Device, null=True, on_delete=models.SET_NULL)
proj_code = models.CharField(max_length=400)
res_key = models.SlugField(max_length=80, verbose_name="Message unique key", unique=True)
read_date = models.DateTimeField(verbose_name="Datetime of vals readings")
unit = models.ForeignKey(ModbusDevice, null=True, on_delete=models.SET_NULL)
def __str__(self):
return self.device
class Meta:
indexes = [
models.Index(fields=['device', 'unit', 'proj_code']),
]
class VarsResults(models.Model):
id = models.AutoField(primary_key=True)
id_res = models.ForeignKey(Results, related_name="mainres", on_delete=models.CASCADE)
var_id = models.ForeignKey(ModbusVariable, null=True, on_delete=models.SET_NULL)
var_val = models.CharField(max_length=400, blank=True)
var_hash = models.CharField(max_length=400)
def __str__(self):
return self.var_hash
class Meta:
indexes = [
models.Index(fields=['id_res', 'var_id']),
]
我想在使用 ORM 的 Django 项目中使用此查询,但我尝试这样做:
varsresults.objects.filter(<conditions>).fields(<fields>)
但不正确,我不知道如何 link 两个表,select 特定字段并在 django ORM
中针对该条件进行过滤有人可以帮我吗? 非常感谢
曼纽尔
您的 Django 查询将是:
start_date = datetime.date(2021, 06, 21)
end_date = datetime.date(2021, 06, 24)
var_results = VarsResults.objects.filter(
id_res__read_date__range=(start_date, end_date)
).select_related(
"id_res"
).values(
"id_res__read_date",
"id_res__unit_id",
"id_res__device_id",
"id_res__proj_code",
"var_val",
)
或者在查询期间访问字段而不获取值:
start_date = datetime.date(2021, 06, 21)
end_date = datetime.date(2021, 06, 24)
var_results = VarsResults.objects.filter(
id_res__read_date__range=(start_date, end_date)
).select_related(
"id_res"
)
read_date = var_results.id_res.read_date
unit_id = var_results.id_res.unit_id
阅读 select_related
的连接。
阅读 here .values()
以及如何访问相关字段。
参见 here __range
。