用Django选择db的祖父表

时间:2016-05-08 22:02:09

标签: python django

我需要使用以下模型打开带有孩子ID的祖父母对象:

class Grandparent(models.Model):
    grandparent_name = CharField(max_length=20)

class Parent(models.Model):
    grandparent = ForeignKey(Grandparent)
    parent_name = CharField(max_length=20)

class Child(models.Model):
    parent = ForeignKey(Parent)
    child_name = CharField(max_length=20)

留在儿童的列表页面我想直接找到它的祖父母。

我有一个想法,在我的视图中使用SQL请求:

def grandparent_detail(request, child_id):
     context = {'grandparent_id':grandparent_id}
         grand= Grandparent.objects.raw(SELECT grandparent_id
         FROM myapp_Grandparent WHERE
         GRandparent.grandparent_id = Parent.parent_id
         AND Parent.parent_id = Child.child_id)
     return render(request, 'myapp/grandparent_detail.html', {'grandparent_id':grandparent_id})

但它没有用。

如果Django中有一个工具来提出这样的结构性请求,你能给我一个建议吗?谢谢。

我的最终目标是能够将来自儿童名单页面的祖父母/父母/子女与这样的网址模式联系起来:

urlpatterns = [
url(r'^$', views.childrenlist, name = 'childrenlist'),
url(r'^grandparents/<grandparent_id>[0-9]+/$', 
    views.grandparent, name = 'grandparent'),
url(r'^grandparents/<grandparent_id>[0-9]+/parents/
    <parent_id>[0-9]+/$', views.parent, name = 'parent'),
url(r'^grandparents/<grandparent_id>[0-9]+/parents/
    <parent_id>[0-9]+/children/<child_id>[0-9]+/$', 
    views.parent, name = child'),

如果我只知道Child_id,可以请出示正确标签的示例吗?

4 个答案:

答案 0 :(得分:0)

试试这个:

flatten

模板:

Parent.objects.filter(
    grandparent=grandparent_id,
    child__parent_id=parent_id
    ).select_related('grandparent')

答案 1 :(得分:0)

设置ForeignKey in django时,可以使用其属性访问外部对象,以便显示此视图:

def grandparent_detail(request, child_id):
     grandparent = Child.objects.get(id=child_id).parent.grandparent
     return render(request, 'myapp/grandparent_detail.html', {'grandparent':grandparent})

允许您访问模板中的祖父对象。不需要SQL。

作为参考,您可以通过代码或模板访问祖父母的Parent个对象:

grandparent.parent_set.all() # A queryset of related parents

答案 2 :(得分:0)

因此,我发现的最终解决方案是关注模板中的链接:

<a href="/myapp/grandparents/{{ child.parent.grandparent_id }}/parents/{{ child.parent_id }}/children/{{ child_id }}/">link</a>

答案 3 :(得分:0)

Child.objects.first().parent.grandparent.grandparent_name

可能为每个Child实例生成1条sql命令。

(来自Django大师:)您可以对此进行优化,并在单个SQL命令中选择所有内容

for child in Child.objects.select_related('parent__grandparent'):
    child.parent.grandparent.grandparent_name

我已经对此进行了测试,并且至少在dj 3.0上可行。

相关问题