[英]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.