Django Reverse Lookup von Fremdschlüsseln


76

Ich habe einen Veranstaltungsort, an dem viele Veranstaltungen stattfinden. Meine Modelle sehen so aus:

class Event(models.Model):
    title = models.CharField(max_length=200)
    date_published = models.DateTimeField('published date',default=datetime.now, blank=True)
    date_start = models.DateTimeField('start date')
    date_end = models.DateTimeField('end date')
    def __unicode__(self):
        return self.title
    description = models.TextField()
    price = models.IntegerField(null=True, blank=True)
    venue = models.ForeignKey(Venue)

class Venue(models.Model):
    title = models.CharField(max_length=200)
    date_published = models.DateTimeField('published date',default=datetime.now, blank=True)
    venue_latitude = models.CharField(max_length=200)
    venue_longitude = models.CharField(max_length=200)
    venue_address = models.CharField(max_length=200)
    venue_city = models.CharField(max_length=200)
    venue_state = models.CharField(max_length=200)
    venue_country = models.CharField(max_length=200)
    description = models.TextField()
    def __unicode__(self):
        return u'%s' % (self.title)

Ich möchte alle Ereignisse anzeigen, die an einem bestimmten Ort stattfinden. Wie kann ich das machen? Meine aktuelle Ansicht sieht aus wie:

def detail(request, venue_id):
    venue = get_object_or_404(Venue, pk=venue_id)
    return render(request, 'venue-detail.html', {'venue': venue})

Welches Modul beziehen sich diese Felder auch auf description = models.TextField ()?
Donkeyboy72

Eigentlich sind diese beiden Modelle jeweils in einer eigenen App, ich habe sie nur zusammen gepostet, um den Punkt zu erklären :)
FLX

Antworten:


120

Sie können verwenden events = venue.event_set, um den anderen Weg zu gehen.

Beachten Sie, dass es sich um ein Managerobjekt handelt venue.event_set, wie Event.objectsSie es aufrufen .allkönnen .filter, .excludeund ähnliches, um ein Abfrageset abzurufen.

Siehe die Django-Dokumentation


Toll! Dank dafür. Wenn ich jedoch über die Ereignisse iterieren möchte (für i in Ereignissen), wird "'RelatedManager'-Objekt ist nicht iterierbar" angezeigt
FLX

Wie haben Sie es in QueryObject geändert?
mp3por

7
@ mp3por location.event_set.all () oder location.event_set.filter () normalerweise.
aptwebapps

1
Wenn jemand den Fehler immer noch sieht AttributeError: 'Foo' object has no attribute 'bar_set', möchten Sie möglicherweise überprüfen, ob er related_nameauf dem ForeignKey/ OneToOneField/ ManyToManyFielddes untergeordneten Modells ( Bar) festgelegt ist, das auf das übergeordnete Modell ( Foo) verweist .
Bartleby

6

Für diejenigen, die "'RelatedManager' Objekt ist nicht iterierbar"

Fügen Sie alle hinzu, um die Elemente vom Manager abzurufen.

{% for area in world_areas.all %}

https://stackoverflow.com/a/16909142/2491526 (kann dies nicht im Kommentar zur ersten Antwort hinzufügen)


3

Geh den umgekehrten Weg. Verwenden EventModell.

def detail(request, venue_id):
    venue = Event.objects.filter(venue__id=venue_id)
    return render(request, 'venue-detail.html', {'venue': venue})

PS: Ich habe noch nie benutzt get_object_or_404(). Ändern Sie den Code entsprechend.


Was kann ich in meiner Vorlage verwenden, um den Titel des Veranstaltungsortes und alle an diesem Veranstaltungsort stattfindenden Veranstaltungen anzuzeigen?
FLX

1
Verwenden Sie in der Vorlage {{event.venue.title}} oder gemäß Ihren Variablen {{location.venue.title}} :){% for i in venue %} {{ i.venue.title }}
rjv

Ich verstehe das, aber wie zeige ich alle Ereignisse an diesem Veranstaltungsort an?
FLX

der Filter gibt ein Array alle Ereignisse enthält , die in den Vorlagen mit Hilfe der an der venue.loop über das Array passierenfor
rjv

1
venue = Event.objects.filter(venue__id=venue_id)Ich denke, dieser Ausdruck gibt QuerySet of Event-Objekt anstelle von Venue-Objekt zurück.
Smokingwang
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.