我需要使用以下模型打开带有孩子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,可以请出示正确标签的示例吗?
答案 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上可行。