使用外键引用另一个Django模型中的变量

时间:2017-07-19 17:05:06

标签: python django

我有一个项目模型,用户可以在其中添加项目,该项目具有项目的相关位置。例如,网站将是项目,而Web开发人员将是职位。这是两个型号。

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,我可以查询位置类并获取所有对象,然后从那里获取项目变量。

我试图创建一个位置' context'在这样的观点中:

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来获取项目数据。出于某种原因,我无法理解如何将它们放在代码中。任何帮助是极大的赞赏!在这一段时间里,我的脑子已经绞尽脑汁了!

1 个答案:

答案 0 :(得分:1)

要遍历相关对象,您可以使用模型的小写名称,后跟__(2个下划线)和其他模型中的字段名称。

所以不要这样:

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

像这样写:

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