Django 根据外键检索 ID 和名称

Django Retrieve id and name based on a ForeignKey

我有以下型号:

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)

在我看来,对于主页功能,我正在尝试显示最后一个包和关联的项目。我不明白如何检索 'project' 字段 (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})

其实我想显示reverse检索到的包对应的'projectname'。但是 projectid 和 project 行不正确。我希望它足够清楚..

抱歉,您的代码有点乱。您不需要单独查找 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 获取对象通常是很好的练习,它节省了您的 try except 块。
  4. reverse() 应与 order_by() 语句一起使用。在您的情况下,仅使用 id 查找最后一个条目会更容易,因为在 django 中 id 是自动递增的。

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

projectid = lastpackages.select_related('project_id')

应该returnAttributeError: 'Packages' object has no attribute 'select_related'

关于你的问题,一旦你有一个 Packages 对象,你可以像这样获得相应的项目 ID:

lastpackages.project.pk

以及完整的 Projects 对象,如果需要的话:

lastpackages.project

试试这个:

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