2017-07-19 7 views
0

Ich habe ein Projektmodell, in dem ein Benutzer ein Projekt mit einer oder mehreren verknüpften Positionen für das Projekt hinzufügen kann. Als Beispiel wäre eine Website ein Projekt, während ein Webentwickler die Position wäre. Hier sind zwei Modelle.Referenzieren von Variablen in einem anderen Django-Modell mit Fremdschlüssel

class Project(models.Model): 
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='project') 
    created_at = models.DateTimeField(auto_now_add=True) 
    title = models.CharField(max_length=255) 
    description = models.TextField() 
    complete = models.BooleanField(default=False) 

    def __str__(self): 
     return self.title.title() 


class Position(models.Model): 
    project = models.ForeignKey(Project, default='',related_name='positions') 
    name = models.CharField(max_length=140) 
    description = models.TextField() 
    skill = models.ForeignKey(Skill, default='') 
    filled = models.BooleanField(default=False) 

    def __str__(self): 
     return '{} - {}'.format(self.project.title.title(), self.name.title()) 

Ich habe eine Ansicht erstellt das Profil des Benutzers zu zeigen und alle aktuellen oder früheren Projekten gearbeitet. Siehe unten:

class ProfileView(LoginRequiredMixin,generic.TemplateView): 
    template_name = 'accounts/profile.html' 
    login_url = settings.LOGIN_REDIRECT_URL 

    def get_context_data(self, **kwargs): 
     context = super(ProfileView, self).get_context_data(**kwargs) 
     lookup = kwargs.get('username') 
     user = models.User.objects.get(username=lookup) 
     profile = models.UserProfile.objects.prefetch_related('skills').get(user=user) 
     context['profile'] = profile 
     context['skills'] = [skill for skill in profile.skills.all()] 

     projects = models.Project.objects.all() 
     context['current_projects'] = projects.filter(Q(owner=user) & Q(complete=False)) 
     context['past_projects'] = projects.filter(Q(owner=user) & Q(complete=True)) 
     return context 

Ich habe Probleme, herauszufinden, wie die Position zu referenzieren (e) für ein bestimmten Projekte in meiner HTML-Vorlage. Ich weiß, wenn ich in Python-Shell versuche, kann ich die Positionsklasse abfragen und alle Objekte holen und dann die Projektvariablen von dort abholen.

Ich habe versucht, eine Position ‚Kontext‘ in der Ansicht wie folgt zu erstellen:

positions = m.Position.objects.all() 
     context['positions'] = positions.filter(Q(owner=user)& Q(complete=False)) 

Aber Django nicht, dass ‚Eigentümer‘ Variable mag -, die ich seit ich verstehe ich Daten von nur Grabbing Positionen. Ich weiß in der Shell kann ich etwas wie m=Position.objects.all() tun und dann eine m[0].project.title, um die Projektdaten zu bekommen. Aus irgendeinem Grund kann ich einfach nicht verstehen, wie man alles in den Code einfügt. Jede Hilfe wird sehr geschätzt! Ich habe mir schon eine Weile über dieses Gehirn hergemacht!

Antwort

1

Um verwandte Objekte zu durchlaufen, können Sie den unteren Modellnamen gefolgt von __ (2 Unterstriche) und den Feldnamen im anderen Modell verwenden.

Anstatt also diese:

positions.filter(Q(owner=user)& Q(complete=False)) 

schreiben wie folgt aus:

positions.filter(Q(project__owner=user) & Q(project__complete=False)) 
Verwandte Themen