Python Django模型中的多重连接

Python Django模型中的多重连接,python,sql,django,Python,Sql,Django,我有以下Django型号: class Species(models.Model): species_id = models.IntegerField(db_column='Species ID', primary_key=True) name = models.CharField(db_column='Name', max_length=100) class Status(models.Model): species_id = models.ForeignKey(

我有以下Django型号:

class Species(models.Model):
    species_id = models.IntegerField(db_column='Species ID', primary_key=True)
    name = models.CharField(db_column='Name', max_length=100)



class Status(models.Model):
    species_id = models.ForeignKey(Species, db_column='Species ID', primary_key=True)
    protected = models.NullBooleanField(db_column='Protected')

class Images(models.Model):
    species_id = models.ForeignKey('Species', db_column='Species ID')
    url = models.CharField(db_column='URL', max_length=719)
是否有任何方法可以在不使用原始SQL的情况下执行以下SQL查询

SELECT Name, URL FROM Images i 
INNER JOIN Species s USING (`Species ID`) 
INNER JOIN Status st USING (`Species ID`) 
WHERE `st`.`Protected` = TRUE

如果您稍微更改一下型号,您可以执行以下操作:

images=images.objects.filter(物种状态受保护=True)
更新型号

class Species(models.Model):
    name = models.CharField(max_length=100)

class Status(models.Model):
    species = models.ForeignKey('Species', primary_key=True)
    protected = models.NullBooleanField()

class Images(models.Model):
    species = models.ForeignKey('Species')
    url = models.CharField(max_length=719)

首先,您的数据库结构有点崩溃。我假设每个
物种
对象只有一个状态,因此不需要有3个模型。对于2个型号,您可以执行以下操作:

class Species(models.Model):
    species_id = models.IntegerField(db_column='Species ID', primary_key=True)
    name = models.CharField(db_column='Name', max_length=100)
    protected = models.NullBooleanField(db_column='Protected')


class Images(models.Model):
    species = models.ForeignKey('Species', db_column='Species ID')
    url = models.CharField(db_column='URL', max_length=719)

# query
data = Images.objects.filter(species__protected=True).values('url', 'species__name')

这就是我重构代码的方式:

class Species(models.Model):
    name = models.CharField(db_column='Name', max_length=100)

class Status(models.Model):
    species = models.ForeignKey(Species, db_column='Species ID', primary_key=True)
    protected = models.NullBooleanField(db_column='Protected')

class Images(models.Model):
    species = models.ForeignKey('Species', db_column='Species ID')
    url = models.CharField(db_column='URL', max_length=719)
然后我会做:

protected_species = Status.objects
                    .filter(protected=True)
                    .values_list('species_id', flat=True)
Images.objects.filter(species_id__in=protected_species)
              .values('url','species__name')

但正如@Maxime Lorant所说,我认为您的模型令人眼花缭乱。

物种
模型中,您不必手动创建
物种id
字段,除非您有充分的理由这样做。Django会自动为您执行此操作。然后,在其他两个模型中,只有名为
species
的字段。您可以将
物种的id
称为
物种id
图像。对象。过滤器(物种状态受保护=True)。值('url',物种id\uu名称')
您忘记了您所说的外键。这件事不全是
物种
拥有
状态
@smaske您正在使用的,因此,默认情况下,如果物种没有状态,可以使用
None
值。