model.py
class Tdzien(models.Model):
dziens = models.SmallIntegerField(primary_key=True, db_column='DZIENS')
dzienrok = models.SmallIntegerField(unique=True, db_column='ROK')
class Tnogahist(models.Model):
id_noga = models.ForeignKey(Tenerg, primary_key=True, db_column='ID_ENERG')
dziens = models.SmallIntegerField(db_column='DZIENS')
我想要的是得到id_noga,其中dzienrok=1234。我知道dziens应该是
dziens = models.ForeignKey(Tdzien)
但事实并非如此我无法改变通常我会用类似于
Tnogahist.objects.filter(dziens__dzienrok=1234)
但是我不知道如何连接和过滤那些没有外键的表。
5条答案
按热度按时间kmynzznz1#
据我所知,没有没有外键的连接,但你可以使用两个查询:
Tnogahist.objects.filter(dziens__in=Tdzien.objects.filter(dzienrok=1234))
5us2dqdw2#
可以通过执行原始sql查询来连接两个表。但是对于这种情况,它是相当讨厌的,所以我建议你重写你的models.py。
你可以在这里检查如何做到这一点
应该是这样的:
oymdgrw73#
你能用
.extra
做这个吗?来自https://docs.djangoproject.com/en/dev/ref/models/querysets/#extra:其中/表
您可以使用where定义显式的SQL WHERE子句(可能是为了执行非显式连接)。可以使用表手动将表添加到SQL FROM子句。
8mmmxcuj4#
为了给@paul-tomblin的回答提供更多的背景,
值得一提的是,对于绝大多数django用户来说;最好的行动过程是实现常规的外键。Django强烈建议避免使用
extra()
,并说“将此方法用作最后手段”。但是,extra()
仍然优于使用Manager.raw()或直接使用django.db.connection执行自定义SQL的原始查询下面是一个使用django的.extra()方法来实现的例子:
使用
extra()
相对于其他方法的主要吸引力在于,它可以很好地处理django的查询集堆栈的其余部分,如filter、exclude、defer、values和slicing。所以你可以把它和传统的django查询逻辑一起插入。举例来说:Tnogahist.objects.filter(...).extra(...).values('id_noga')[:10]
velaa5lx5#