Python Django queryset在查询中获取空值
所以我试图让所有的值都能显示在我的模板中。然而,我遇到了这个问题: 我有这些模型:Python Django queryset在查询中获取空值,python,django,django-views,django-templates,Python,Django,Django Views,Django Templates,所以我试图让所有的值都能显示在我的模板中。然而,我遇到了这个问题: 我有这些模型: class Project(models.Model): projectId = models.AutoField(primary_key=True, db_column="Id", db_index=True, verbose_name='Project ID') description = models.CharField(max_length=900) class PM(models.Mo
class Project(models.Model):
projectId = models.AutoField(primary_key=True, db_column="Id", db_index=True, verbose_name='Project ID')
description = models.CharField(max_length=900)
class PM(models.Model):
PMid = models.AutoField(primary_key=True, db_column="Id", db_index=True)
PMNumber = models.CharField(max_length=50, unique=True, db_column="PMNumber")
description = models.CharField(max_length=600)
projectId = models.ForeignKey(Project, on_delete=models.CASCADE,
db_column="ProjectID", related_name='+')
我正在尝试获取所有项目的项目编号。为此,我尝试了以下方法:
fpm = PM.objects.all()
projects = []
for i in fpm:
projects.append({'ProjectName': i.projectId.description, 'PMNumber': i.PMNumber})
[{'ProjectName': 'pr2', 'PMNumber':'None'}, {'ProjectName':'pr3' , 'PMNumber':'None'}, {'ProjectName': 'pr1', 'PMNumber': '119508-01'}, {'ProjectName': 'pr1', 'PMNumber': '119490-01'}]
之后的结果是这样的
[{'ProjectName': 'pr1', 'PMNumber': '119508-01'}, {'ProjectName': 'pr1', 'PMNumber': '119490-01'}]
但是,我仍然缺少一些没有PM的项目,我希望queryset中的所有项目都能够在模板中显示它们,而不仅仅是那些有PM的项目。它应该是这样的:
fpm = PM.objects.all()
projects = []
for i in fpm:
projects.append({'ProjectName': i.projectId.description, 'PMNumber': i.PMNumber})
[{'ProjectName': 'pr2', 'PMNumber':'None'}, {'ProjectName':'pr3' , 'PMNumber':'None'}, {'ProjectName': 'pr1', 'PMNumber': '119508-01'}, {'ProjectName': 'pr1', 'PMNumber': '119490-01'}]
有办法做到这一点吗?或者在视图中是否有其他方法来实现这一点
注意:我知道在Django中为每个类设置一个ID是不正确的,但在我工作的地方这是一种标准。所以我不能改变它。然后你应该用相反的方法:
result = list(Project.objects.values(
'description',
ProjectName=F('pm__PMNumber')
))
然后,您可以查询:
result = list(Project.objects.values(
'description',
ProjectName=F('pm_set__PMNumber')
))
您还可以将列表后处理到包含词典的词典中,其中projectName
(或者更好的projectName
是一个列表,其中包含:
我在
项目中看到语法错误。append
。Dict从未打开过?是的,你说得对,我写问题时只是语法错误。代码写得很好。我已经编辑了这个问题。感谢你注意到:DOh,我以这种方式使用它,这样我就可以在Django管理中看到它,作为另一个模型的一部分,我无法看到它以正确的方式添加。我是否应该更改它?我理解你写的内容,但我需要项目名称不为空,如果没有任何内容,则PM为空。我可以这样做吗?@DiegoDuarte:鉴于PM
不存在,确切地说项目名称
中应该放什么?让我获得更好的上下文:我正在尝试在HTML模板的列表中显示所有可用的项目,但我还需要有项目的PM
,以便能够显示哪些项目有PM
,哪些项目没有。因此,考虑到PM
不存在的事实,ProjectName
应该与description
相同>我希望它看起来应该是这样的:Project1:PMS:1029210282
,Project2:
,Project3:PMS:xxxx,xxxx
@DiegoDuarte:也许你可以看看可能的答案生成的输出,并对需要更改的内容进行评论。
from itertools import groupby
from operator import itemgetter
from django.db.models.functions import Coalesce
result = list(Project.objects.values(
'description',
ProjectName=Coalesce('pm_set__PMNumber', 'description')
).order_by('description'))
result = [
{ 'description': k, 'projectNames': list(map(itemgetter('projectName'), vs)) }
for k, vs in groupby(itemgetter('description'), result)
]
from itertools import groupby
from operator import itemgetter
result = list(Project.objects.values(
'description',
ProjectName=F('pm_set__PMNumber')
).order_by('description'))
result = [
{ 'description': k, 'projectNames': list(filter(None, map(itemgetter('projectName'), vs))) }
for k, vs in groupby(itemgetter('description'), result)
]