Join query in Django


If we have two tables, virulence_genome and virulence_cds, and their schemas are as following:


                      Table "public.virulence_genome"
      Column      |         Type          | Collation | Nullable | Default
------------------+-----------------------+-----------+----------+---------
 genome_id        | integer               |           | not null |
 accession_number | character varying(50) |           | not null |
 strand           | integer               |           | not null |
 start_position   | integer               |           | not null |
 end_position     | integer               |           | not null |
 location         | character varying(20) |           | not null |


				Table "public.virulence_cds"
   Column    |  Type   | Collation | Nullable | Default
-------------+---------+-----------+----------+---------
 genome_id   | integer |           | not null |
 gene        | text    |           | not null |
 locus_tag   | text    |           | not null |
 note        | text    |           | not null |
 product     | text    |           | not null |
 cds_db_xref | text    |           | not null |


genome_id in virulence_cds is a foreign key of virulence_genome. What if we want to get gene names and their locations for genes that are not located on genome? Use sql query we could write something like:

select vc.gene,vg.location from virulence_cds vc join virulence_genome vg on vc.genome_id = vg.genome_id and vg.location !='genome';

What to do in Django view? I have propsed two ways to do it. Obvisouly one way is better than the other. So to find all CDs which are not located at genome, we could write:

def func(request):
	genome_ids=Genome.objects.filter(location='plasmid').values_list('genome_id')
	return Cds.objects.select_related('genome').filter(~Q(genome_id__in=genome_ids))

or

def func(request):
	return Cds.objects.select_related('genome').filter(~Q(genome__location='plasmid'))

No comments:

Post a Comment

Datatable static image not found on the server

When you use ```datatables.min.css``` and ```datatables.min.js``` locally, instead of datatables CDN, you may have encountered that ```sort...