我有两个这样的模型:
class AA(models.Model):
name = models.CharField()
state = models.IngerField()
class BB(models.Model):
aa_id = models.ForeignKey(AA)
我的问题是: 我如何获得状态为10且不在BB中的所有对象AA?
在sql中我做这样的事情:
select * from AA
where AA.state = 10 and AA.id not in (select aa_id from BB)
或
select * from AA
left join BB on BB.aa_id = AA.id
where AA.state = 10 and BB.id is null
我知道如果BB有外键,我可以获得所有AA对象并逐个检查。但这不是正确的做法。
感谢。
答案 0 :(得分:25)
这样的事情:
AA.objects.filter(state=10, bb=None)
答案 1 :(得分:0)
这个问题很老,但是直到9年后答案和评论才真正有用。 虽然,即使阅读了@Daniel Roseman's很好的答案(感谢老兄,您的回答对我也有很大帮助),所以我在文档中进一步检查了它的工作原理。
您可以按照文档中的说明阅读以下内容:
Lookups that span relationships
Django提供了一种强大且直观的方式来“跟踪”查找中的关系,并 在后台自动为您提供SQL JOIN。跨越 关系,在模型之间使用相关字段的字段名称, 用双下划线隔开,直到到达所需字段为止。
此示例检索名称为Blog的所有Entry对象 “甲壳虫博客”:
>>> [[1, 4, 7],[2, 4],[5, 0]]
它也向后工作。要引用“反向”关系,请使用模型的小写名称。
以django民意测验教程为例,“问题与选择”如下:
>>> Entry.objects.filter(blog__name='Beatles Blog')
# models.py
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)