2016-07-05 2 views
-1
class Server(models.Model): 
    client = models.ForeignKey(Client, on_delete=models.CASCADE) 
    ... 

class Schedule(models.Model): 
    client = models.ForeignKey(Client, on_delete=models.CASCADE) 
    ... 

class LineItem(models.Model): 
    schedule = models.ForeignKey(Schedule, on_delete=models.CASCADE) 
    server = models.ForeignKey(Server, blank=True, null=True) 
    ... 

Ich habe einige wirklich böse Logik in meiner Vorlage keine Lineitems anzuzeigen, dieDjango, Filter-Abfrage über mehrere entry_set.all() gesetzt Beziehungen

{% for schedule in server.client.schedule_set.all %} 
    {% for lineitem in schedule.lineitem_set.all %} 
     {% if lineitem.server == server %} 
      {{ lineitem.id }} 
      {{ lineitem.description }} 
     {% endif %} 
    {% endfor %} 
{% endfor %} 
in einem Server-Detailseite zu einem bestimmten Server-Objekt beziehen

UPDATE: zur Klarstellung

ich bin in der Lage, die relevanten Informationen von innen nach Ansicht der folgenden zu erhalten:

def serverDetailView(request, pk): 
    # Fetches all the line items related to the current server 
    server = get_object_or_404(Server, pk=pk) 
    line_items = [] 
    for schedule in server.client.schedule_set.all(): 
     items = schedule.lineitem_set.all() 
     for item in items: 
      if item.server == server: 
       line_items.append(item) 
    context = {'server': server, 'line_items': line_items} 
    return render(request, 'reports/server_detail.html', context) 

Dann in der Vorlage:

{% for item in line_items %} 
    {{ item }} 
{% endfor %} 

Die Frage ist, kann ich diese relevant Lineitem mit einer einzigen Abfrage filtere nach unten?

Antwort

0

Anstatt die umgekehrte Beziehung model_set Manager zu folgen. Sie können unter Verwendung der doppelten Unterstrich-Schreibweise aus dem Django ORM

line_items = LineItem.objects.filter(schedule__client=server.client) 
+0

Es ist nie wirklich fiel mir ein, zu tun auf diese Weise rund um die ForeignKey Beziehungen folgen! Ich bin arbeitsfrei, bis morgen bin ich 99%. Das werde ich sein. Vielen Dank! –

Verwandte Themen