如何从不强制引用完整性的模型中选择孤立记录?

时间:2010-02-06 21:32:59

标签: django django-models

鉴于在sqlite3中实现了以下模型

class Parent(models.Model):
    pass

class Children(models.Model):
    parent=models.ForeignKey(Parent,primary_key=True)

将数据从电子表格导入儿童后,我需要获得一份没有孩子的父母名单,为此我正在使用......

Parent.objects.filter(children__isnull=True)

似乎工作正常。

但由于没有执行参照完整性,我还需要一份没有父母的儿童名单,为此我正在努力......

Children.objects.filter(parent__isnull=True)

返回一个空的查询集,即使有些是孤儿? 关于实现这一目标的最佳方式的任何指示都将非常感激。

顺便说一句,我知道我可以在导入过程中找到孤儿,但这不符合我的目的。

2 个答案:

答案 0 :(得分:2)

使用Django允许嵌套查询的事实:

def Foo(request):
    parent_ids=Parent.objects.values('id')
    orphans=Children.objects.exclude(parent_id__in=parent_ids)
    return render_to_response('Foo.html', {'orphans':orphans})

答案 1 :(得分:1)

还没有答案,所以这是我尝试回答我自己的问题

这是一个有效的丑陋解决方案......

def Foo(request):
    orphans=[]
    for child in Children.objects.all():
        try:
            if child.parent:
                pass
        except Parent.DoesNotExist:
            orphans.append(child)
    return render_to_response('Foo.html',{'orphans':orphans})

希望有更好的方法吗?


更新改进方法......

def Foo(request):
    parent_id_list=[row.pk for row in Parent.objects.all()]
    orphans=Children.objects.exclude(pk__in=parent_id_list)
    return render_to_response('Foo.html',{'orphans':orphans})