繁体   English   中英

在Django ORM中的3个表上选择相关

[英]Select related on 3 tables in Django ORM

我需要一些帮助来在Django框架中执行select_related。 我的模型是:

models.py

class Richiesta(models.Model):
    # TIPOLOGIE_DISPOSITIVO can be = BK or SC
    codice = models.CharField(max_length=20, null=True, blank=True, unique=True)
    ufficio_registrazione = models.ForeignKey(UfficioRegistrazione, null=True, blank=False)
    tipologia = models.CharField(max_length=50, null=False, blank=False, choices=TIPOLOGIE_DISPOSITIVO, default=TIPOLOGIE_DISPOSITIVO[0][0])
    tipo = models.IntegerField(null=False, blank=False, choices=TIPO_CHOICES, default=TIPO_PRIMO_RILASCIO)
    data_produzione = models.DateTimeField(null=True, blank=True)

class UfficioRegistrazione(models.Model):
    cliente = models.ForeignKey(Cliente, null=False, blank=False)

class Cliente(models.Model):
    # provider can be = 1 or 2
    denominazione = models.CharField(max_length=100, null=False, blank=False)
    codice_cliente = models.PositiveIntegerField(null=False, blank=False, db_index=True)
    provider = models.IntegerField(null=False, blank=False, choices=PROVIDER_CHOICES)

还有我需要对Django ORM执行的原始SQL查询:

select cms_richiesta.id, cms_richiesta.tipologia, cms_richiesta.data_produzione, 
cms_richiesta.ufficio_registrazione_id, cms_ufficioregistrazione.id, 
cms_ufficioregistrazione.cliente_id, cms_cliente.id, cms_cliente.provider, 
cms_cliente.denominazione, cms_cliente.codice_cliente
from cms_richiesta INNER JOIN cms_ufficioregistrazione on 
cms_richiesta.ufficio_registrazione_id=cms_ufficioregistrazione.id
INNER JOIN cms_cliente on cms_ufficioregistrazione.cliente_id = 
cms_cliente.id where data_produzione>'2011-01-01' and data_produzione<'2017- 
12-31' and cms_cliente.provider = 2 and cms_richiesta.tipologia='BK'

有人能帮我吗?

Richiesta.objects.filter(ufficio_registrazione__cliente__provider=2,tipologia='BK')

休息过滤器可以这样添加

您可以将其处理为:

from datetime import datetime

Richiesta.objects.select_related(
    'ufficio_registrazione',
    'ufficio_registrazione__cliente',
).filter(
    data_produzione__range=(datetime(2011, 1, 1), datetime(2017, 12, 30)),
    ufficio_registrazione__cliente__provider=2,
    tipologia='BK',
)

通常情况下, .select_related(..)在这里没有必要的,因为我们执行这些JOIN已经s的滤波部分,但通常最好是比隐明确的(尤其是在情况下,你以后会忽略的条件,仍然希望这些相关模型)。

它将检索Richiesta对象,但已经加载了相关模型。

您可能是说<= '2017-12-31'在这种情况下,日期范围的上限也需要增加。

我不想粘贴并复制其他答案,但是如果您认为这确实是必要的,则可以使用.values()仅提取要工作的列,因为在模板中,您将仅显示所需的数据

richiesta.values('tipologia', 'data_produzione'...) # when richiesta is the queryset

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM