Django内部联接数据库查询
您好,我的项目中有3个模型,希望对它们进行内部连接查询Django内部联接数据库查询,django,postgresql,Django,Postgresql,您好,我的项目中有3个模型,希望对它们进行内部连接查询 class Experiment(models.Model): experiment_id = models.AutoField(primary_key=True) experiment_name = models.CharField(max_length=500) class DataFile(models.Model): file_id = models.AutoField(primary_key=True)
class Experiment(models.Model):
experiment_id = models.AutoField(primary_key=True)
experiment_name = models.CharField(max_length=500)
class DataFile(models.Model):
file_id = models.AutoField(primary_key=True)
file_name = models.CharField(max_length=500)
experiment_id = models.IntegerField(blank=True, null=True)
date = models.DateTimeField(blank=True)
created_on = models.DateTimeField(auto_now_add=True)
class Analysis(models.Model):
sample_name = models.CharField(max_length=500)
file_id = models.IntegerField(blank=True, null=True)
我正在使用postgre,我正在尝试的查询是
select experiment_name,ma.rt
FROM main_experiment me
INNER JOIN main_datafile md
ON me.experiment_id = md.experiment_id
INNER JOIN main_analysis ma
ON ma.file_id = md.file_id
我想使用实验id提取所有样本名称
我试过了
和许多其他组合,但我总是得到下面的错误
不允许对自动字段或字段上的联接进行不支持的查找“” 为什么不使用foreignkey?如果你的模特看起来像
class Experiment(models.Model):
#experiment_id = models.AutoField(primary_key=True) # you don't need to add, django will do it for you.
experiment_name = models.CharField(max_length=500)
class DataFile(models.Model):
#file_id = models.AutoField(primary_key=True) # you don't need to add, django will do it for you.
file_name = models.CharField(max_length=500)
experiment = models.ForeignKey(Experiment, related_name="data_file")
date = models.DateTimeField(blank=True)
created_on = models.DateTimeField(auto_now_add=True)
class Analysis(models.Model):
sample_name = models.CharField(max_length=500)
data_file = models.ForeignKey(DataFile, related_name="analysis")
然后你可以做:
Experiment.objects.filter(data_file__analysis__sample_name= 18)
你查过了吗@giaco是的,我试过Analysis.objects.filter(sample_name_uuufile_id=257),但它给了我提到的错误谢谢你的回复,数据库已经创建好了,里面有数据,有没有更简单的方法不用修改当前的表structure@dexter:我认为这是一个棘手的方法,实际上,如果您使用models.ForeignKey更改模型结构,并且只是假装迁移,那么它应该可以正常工作。实验id=models。IntegerField(blank=True,null=True)变为实验id=models。ForeignKey(实验,blank=True,related_name=“data_file”,null=True)和文件id应为:;file_id=models.ForeignKey(DataFile,related_name=“analysis”)。或者:您可以始终执行:analysis=analysis.objects.filter(sample_name=18)。values_list(“file_id”,flat=True)datafiles=DataFile.objects.filter(file_id_in=analysis)。values_list(“实验_id,flat=True)实验=实验。objects.filter(实验_id_in=datafiles)
Experiment.objects.filter(data_file__analysis__sample_name= 18)