Tengo dos mesas.
class DibbsSpiderDibbsMatchedProductFieldsDuplicate(models.Model): nsn = models.TextField() nsn2 = models.TextField() cage = models.TextField() part_number = models.TextField() company_name = models.TextField(blank=True, null=True) supplier = models.TextField(db_column='Supplier', blank=True, null=True) # Field name made lowercase. cost = models.CharField(db_column='Cost', max_length=15, blank=True, null=True) # Field name made lowercase. list_price = models.CharField(db_column='List_Price', max_length=15, blank=True, null=True) # Field name made lowercase. gsa_price = models.CharField(db_column='GSA_Price', max_length=15, blank=True, null=True) # Field name made lowercase. hash = models.TextField() nomenclature = models.TextField() technical_documents = models.TextField() solicitation = models.CharField(max_length=32) status = models.CharField(max_length=16) purchase_request = models.TextField() issued = models.DateField() return_by = models.DateField() file = models.TextField() vendor_part_number = models.TextField() manufacturer_name = models.TextField(blank=True, null=True) product_name = models.TextField(blank=True, null=True) unit = models.CharField(max_length=15, blank=True, null=True) class Meta: managed = False db_table = 'dibbs_spider_dibbs_matched_product_fields_duplicate' class DibbsSpiderSolicitation(models.Model): line_items = models.IntegerField() nsn = models.TextField() nomenclature = models.TextField() technical_documents = models.TextField() purchase_request = models.TextField() class Meta: managed = False db_table = 'dibbs_spider_solicitation'
¿Cuál será la consulta Django equivalente para la combinación interna de dos tablas en la columna nsn
? Mi función de vistas será como
def inner(request,nsn): u_m = DibbsSpiderDibbsMatchedProductFieldsDuplicate.objects.filter(nsn2__icontains=id) c_m = DibbsSpiderSolicitation.objects.filter(nsn__icontains=id) obj = ....................... context = {'obj':obj} return render(request,,"a.html",context)
el conjunto de consultas debe devolver la combinación de dos tablas según el nsn común.
el obj debería devolver la combinación de u_m
y c_m
. Si u_m
contiene solo una fila y c_m
contiene muchas filas, el obj debe replicar los valores de u_m.
Puedes probar algunas de las opciones:
3. Usando la consulta IN según la siguiente lógica:
DibbsSpiderDibbsMatchedProductFieldsDuplicate.objects.filter( nsn2__in=DibbsSpiderSolicitation.objects.filter(nsn__icontains='text_to_search').values('origin'))
Primero, grandes nombres de modelos. Pongámosles un alias: DibbsSpiderDibbsMatchedProductFieldsDuplicate is Apples ; DibbsSpiderLa solicitud es naranjas
inner_qs = Apples.objects.all().extra( tables=("yourapp_oranges",), where=("yourapp_apples.nsn=yourapp_oranges.nsn",), )
La documentación menciona que esta API quedará obsoleta: https://docs.djangoproject.com/en/4.0/ref/models/querysets/#extra
Bajo la clase DibbsSpiderDibbsMatchedProductFieldsDuplicate
agregue:
fkey = models.ForeignKey('DibbsSpiderSolicitation')
entonces puedes acceder fácilmente a su unión:
obj = DibbsSpiderDibbsMatchedProductFieldsDuplicate.Objects.filter(fkey__nsn).select_related()
Ahora es su elección lo que desea hacer con nsn2
obj = DibbsSpiderDibbsMatchedProductFieldsDuplicate.objects.extra(where = ['''SELECT * FROM DibbsSpiderSolicitation INNER JOIN DibbsSpiderDibbsMatchedProductFieldsDuplicate ON DibbsSpiderSolicitation.nsn = DibbsSpiderDibbsMatchedProductFieldsDuplicate.nsn2;''']) # or obj = DibbsSpiderDibbsMatchedProductFieldsDuplicate.objects.raw('''SELECT * FROM DibbsSpiderSolicitation INNER JOIN DibbsSpiderDibbsMatchedProductFieldsDuplicate ON DibbsSpiderSolicitation.nsn = DibbsSpiderDibbsMatchedProductFieldsDuplicate.nsn2;''')
obj = DibbsSpiderSolicitation.objects.filter(nsn__in=DibbsSpiderDibbsMatchedProductFieldsDuplicate.objects.nsn2)
Lo siento, no pude probar ninguno.