微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Django中具有非外键约束

如何解决在Django中具有非外键约束

| 在我的数据库中,我有一对表(
tableA
tableB
),它们都具有引用foreign3ѭ中同一列
ID
的外键。我能够使用的sql
SELECT *
FROM tableA
INNER JOIN tableB on tableA.ID=tableB.ID
WHERE tableB.year=2011
查询
SELECT *
FROM tableA
INNER JOIN tableB on tableA.ID=tableB.ID AND tableB.year=2011
做过同样的事情 在Django中,我尝试使用代码执行此操作
subquery=tableB.objects.filter(year=2011).values_list(id,flat=True)
results=tableA.objects.filter(id__in=list(subquery))
按照文档中的建议。我知道这有点不同,因为它只返回
tableA
中的列,但无论如何我都只使用它们。 Django代码似乎很慢,我认为部分原因是因为对
tableA
的每一行都进行了设置成员资格测试,这非常大。有没有一种方法可以在Django中更快地完成而无需使用原始sql(我显然可以根据需要使用它)?     

解决方法

        这很慢,因为它正在创建一个查询,看起来可能像
SELECT * FROM TableA WHERE ID IN (SELECT ID FROM TableB WHERE year=2011)
就像@Udi所说的那样,如果可以通过添加外键某种方式来“ django”化模型,那将更好。否则,请使用RawSQL。那就是它的用途。     ,        看来您的模型不是很“友好”。您是否使用一对一关系,而表pk是外键? (如果没有,请在问题中发布您的架构)。 Django希望您的表(模型)主键是唯一的自动增量整数,而不是外键。 django明智的做法是更好的:
class TableC(models.Model):
     name = models.CharField(max_length=1000)

class TableA(models.Model): 
     tablec = models.OneToOneField(TableC)

class TableB(models.Model): 
     tablec = models.OneToOneField(TableC)
     year = models.IntegerField()
请注意,所有字段都有一个(隐式)id字段,该字段是表的主键。现在执行:
TableA.objects.filter(tablec__tableb__year__exact=2011)
实际上,您可以使用外键作为主键:
class TableC(models.Model):
     name = models.CharField(max_length=1000)

class TableA(models.Model): 
     tablec = models.OneToOneField(TableC,primary_key=True,db_column=\'id\')

class TableB(models.Model): 
     tablec = models.OneToOneField(TableC,db_column=\'id\')
     year = models.IntegerField()
并执行相同的查询。但是,这以后可能会给您带来更多问题(“无保修”)。     ,        请勿将
subquery
转换为列表。如果您只是这样做:
results=tableA.objects.filter(id__in=subquery)
Django应该足够聪明才能实际执行子查询,而不是两个单独的查询。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。