Necesito abrir el objeto abuelo con la identificación del niño con el siguiente modelo:

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)

Manteniéndome en la página de la lista de Niños Quiero ir directamente a su Abuelo.

Tuve una idea para usar la solicitud SQL en mi opinión, algo como esto:

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})

Pero no funciona.

¿Podría darme un consejo si hay un instrumento en Django para hacer tales solicitudes estructurales? Gracias.

Mi objetivo final es poder vincular a los abuelos / padres / hijos desde la página de la lista de niños con dichos patrones de URL:

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'),

¿Puede mostrar un ejemplo de etiqueta adecuada si solo conozco el Child_id?

0
Dant 9 may. 2016 a las 01:02

3 respuestas

La mejor respuesta

Entonces, la solución final que encontré para mi caso es seguir el enlace en la plantilla:

<a href="/myapp/grandparents/{{ child.parent.grandparent_id }}/parents/{{ child.parent_id }}/children/{{ child_id }}/">link</a>
0
Dant 15 may. 2016 a las 20:55

Cuando configura un ForeignKey en django puede acceder a objeto extraño que usa su propiedad de modo que esta vista:

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

Le permitirá acceder al objeto abuelo en la plantilla. No se necesita SQL.

Como referencia, puede acceder a los objetos Parent de un abuelo en código o en plantillas como esta:

grandparent.parent_set.all() # A queryset of related parents
0
9 may. 2016 a las 03:48

Prueba esto:

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

Plantilla:

{{ parent.grandparent.grandparent_name }}
0
WayBehind 8 may. 2016 a las 23:56