Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django queryset在查询中获取空值_Python_Django_Django Views_Django Templates - Fatal编程技术网

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)
]