Django获取未被外键引用的对象

时间:2011-01-21 11:34:17

标签: django

我有两个这样的模型:

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对象并逐个检查。但这不是正确的做法。

感谢。

2 个答案:

答案 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)