Django根据ForeignKey

时间:2015-10-13 21:47:49

标签: django django-queryset

我有以下型号:

class Projects(models.Model):
    id = models.IntegerField(primary_key=True, blank=True)
    name = models.CharField(max_length=20, unique=True)
    company = models.CharField(max_length=20, blank=True, null=True)
    creation_date = models.DateField(auto_now_add=True, auto_now=False)



class Packages(models.Model):
    id = models.IntegerField(primary_key=True, blank=True)
    name = models.CharField(max_length=50)
    extension = models.CharField(max_length=3)
    gen_date = models.DateTimeField(auto_now_add=True, auto_now=False)
    project = models.ForeignKey(Projects)

在我看来,对于主页功能,我试图显示最后一个包,以及相关项目。我不明白如何检索项目' field(FK):

try:
    lastpackages = Packages.objects.reverse()[:1].get()
except Packages.DoesNotExist:
    lastpackages = None

projectid = lastpackages.select_related('project_id')
project = Projects.objects.get(id=lastpackages.project)

return render(request, 'homepage.html', {'lastpackages': lastpackages,
                                         'project': project})

事实上,我想要显示' projectname'对应于reverse检索到的包。但项目和项目的线条不正确。我希望它足够清楚......

3 个答案:

答案 0 :(得分:1)

很抱歉,但您的代码有点乱。您不需要单独查找Project,django ORM会为您执行此操作:

package = Package.objects.order_by('-id')[0]
project = package.project

package.project会为您提供与该软件包相关联的项目,无需使用id进行查询。

有人建议:

  1. 您不需要定义id,django会为您完成。
  2. 不要在你的模特名称中使用复数形式,django会为你做。
  3. 鉴于使用get_object_or_404来获取对象通常是一项很好的练习,它会保存你的尝试,除了阻止。
  4. reverse()应与order_by()语句一起使用。在您的情况下,使用id查找最后一个条目会更容易,因为在django中id会自动递增。

答案 1 :(得分:1)

试试这个:

lastpackage = Packages.objects.reverse()[0]
project = lastpackage.project

答案 2 :(得分:0)

首先要记住的是lastpackagesPackages对象,而不是Queryset,所以这一行是错误的:

projectid = lastpackages.select_related('project_id')

它应该返回AttributeError: 'Packages' object has no attribute 'select_related'

关于您的问题,一旦您拥有Packages个对象,就可以获得相应的项目ID:

lastpackages.project.pk

如果需要,还有完整的Projects对象:

lastpackages.project