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
.
查询
这里有一些建议:
- 你不需要定义
id
,django会为你做。
- 不要在你的模型名称中使用复数形式,django 会为你做。
- 鉴于使用 get_object_or_404 获取对象通常是很好的练习,它节省了您的 try except 块。
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
我有以下型号:
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
.
这里有一些建议:
- 你不需要定义
id
,django会为你做。 - 不要在你的模型名称中使用复数形式,django 会为你做。
- 鉴于使用 get_object_or_404 获取对象通常是很好的练习,它节省了您的 try except 块。
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