How can I select entries in one table based on criteria in another table in Django's ORM if the foreign key is not referencing a primary key but another column with unique constraint?
The corresponding SQL command would be:
SELECT TableMoon.name
FROM TableMoon JOIN TablePlanet
ON TableMoon.planet = TablePlanet.name
WHERE classification = 'inner_planet';
预期的答案是:月球、火卫二、土卫二
我试图在Django ORM中从上面改写SQL命令,但每次都会得到一个空的QuerySet:
Tablemoon.objects.filter(planet__classification='inner_planet').values('name')
#Out: <QuerySet []>
Tablemoon.objects.filter(planet_id__classification='inner_planet').values('name')
#Out: <QuerySet []>
Background
I have a Django app that is connected to a legacy sqlite database. I am not allowed to modify the database scheme. The database looks like this:
TablePlanet
------------------------------------
planet_id | name | classification
------------------------------------
1 | Mercury | inner_planet
2 | Venus | inner_planet
3 | Earth | inner_planet
4 | Mars | inner_planet
5 | Jupiter | outer_planet
6 | Saturn | outer_planet
7 | Uranus | outer_planet
8 | Neptune | outer_planet
TableMoon
------------------------
moon_id | planet | name
------------------------
1 | Earth | Moon
2 | Mars | Phobos
3 | Mars | Deimos
4 | Jupiter | Io
5 | Jupiter | Europa
6 | Jupiter | Ganymede
列TablePlanet.name
具有唯一约束.列TableMoon.planet
具有引用TablePlanet.name
的外键约束.
以下是这些表的SQL代码:
CREATE TABLE tablePlanet (
planet_id INTEGER PRIMARY KEY,
name TEXT UNIQUE NOT NULL,
classification TEXT
);
CREATE TABLE tableMoon (
moon_id INTEGER PRIMARY KEY,
planet TEXT,
name TEXT,
FOREIGN KEY (planet) REFERENCES tablePlanet(name)
);
我的Models.py文件如下所示
from django.db import models
class Tableplanet(models.Model):
planet_id = models.AutoField(primary_key=True, null=False)
name = models.TextField(unique=True)
classification = models.TextField(blank=True, null=True)
class Meta:
managed = False
db_table = 'tablePlanet'
class Tablemoon(models.Model):
moon_id = models.AutoField(primary_key=True, null=False)
planet = models.ForeignKey('Tableplanet', models.DO_NOTHING,
db_column='planet', blank=True, null=True)
name = models.TextField(blank=True, null=True)
class Meta:
managed = False
db_table = 'tableMoon'
首先让我感到困惑的是Django对Planet-Column的命名,其中一种情况下是‘Planet’,另一种情况下是‘Planet_id’:
Tablemoon._meta.get_fields()
#Out: (<django.db.models.fields.AutoField: moon_id>,
#Out: <django.db.models.fields.related.ForeignKey: planet>,
#Out: <django.db.models.fields.TextField: name>)
Tablemoon.objects.all().values()[0]
#Out: {'moon_id': 1, 'planet_id': 'Earth', 'name': 'Moon'}
我非常感谢您在这方面的建议!