[英]Referencing Variables in Another Django Model with Foreign Key
我有一個項目模型,用戶可以在其中添加一個帶有項目相關位置的項目。 例如,網站將是項目,而網站開發人員將是職位。 這是兩個模型。
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())
我創建了一個視圖,以顯示用戶的個人資料以及正在處理的任何當前或過去的項目。 見下文:
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
我在弄清楚如何引用html模板中特定項目的位置時遇到了麻煩。 我知道,如果我嘗試使用python shell,我可以查詢position類並獲取所有對象,然后從那里獲取項目變量。
我試圖在這樣的視圖中創建一個位置“上下文”:
positions = m.Position.objects.all()
context['positions'] = positions.filter(Q(owner=user)& Q(complete=False))
但是Django不喜歡該“所有者”變量-我理解這是因為我只是從位置中獲取數據。 我知道在shell中我可以執行m=Position.objects.all()
,然后執行m[0].project.title
來獲取項目數據。 由於某種原因,我只是不明白如何在代碼中將它們放在一起。 任何幫助是極大的贊賞! 讓我的腦袋沉迷了一段時間!
要遍歷相關對象,可以使用模型的小寫名稱,后跟__
(2個下划線)和另一個模型中的字段名稱。
所以代替這個:
positions.filter(Q(owner=user)& Q(complete=False))
這樣寫:
positions.filter(Q(project__owner=user) & Q(project__complete=False))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.