gpt4 book ai didi

python - Django查询集在查询中获取空值

转载 作者:行者123 更新时间:2023-12-04 10:10:02 24 4
gpt4 key购买 nike

所以我试图让所有值能够显示在我的模板中。但是我遇到了这个问题:

我有这些模型:

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='+')

我正在尝试使用各自的 PMNumber 获取所有项目。为此,我正在尝试这样的事情:
fpm = PM.objects.all()
projects = []
for i in fpm:
projects.append({'ProjectName': i.projectId.description, 'PMNumber': i.PMNumber})


之后的结果是这样的
[{'ProjectName': 'pr1', 'PMNumber': '119508-01'}, {'ProjectName': 'pr1', 'PMNumber': '119490-01'}]

但是,我仍然缺少一些没有与其相关的 PM 的项目,我希望查询集中的所有项目都能够在模板中显示它们,而不仅仅是那些有 PM 的项目。它应该是这样的:
[{'ProjectName': 'pr2', 'PMNumber':'None'}, {'ProjectName':'pr3' , 'PMNumber':'None'}, {'ProjectName': 'pr1', 'PMNumber': '119508-01'}, {'ProjectName': 'pr1', 'PMNumber': '119490-01'}]

有没有办法做到这一点?或者有另一种方法可以在 View 中做到这一点吗?

注意:我知道在 Django 中为每个类设置 ID 是不对的,但这在我工作的地方是一种标准。所以我无法改变它。

最佳答案

然后,您应该以相反的方式执行此操作:

result = list(Project.objects.values(
'description',
ProjectName=F('pm__PMNumber')
))

对于 Project s 没有 PM存在, None将用于 ProjectName .如果有多个 PM s 相同 Project ,所有这些 PM s 将被添加。

话虽如此,我不明白你为什么设置 related_namerealted_name='+' .这是反向关系的名称,因此最好将其设置为:
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='pm_set'
)

然后你查询:
result = list(Project.objects.values(
'description',
ProjectName=F('pm_set__PMNumber')
))

您可以更换丢失的 ProjectNamedescription该项目的:
from django.db.models.functions import Coalesce

result = list(Project.objects.values(
'description',
ProjectName=Coalesce('pm_set__PMNumber', 'description')
))

您还可以将列表后处理为包含 projectName 的字典的字典。 (或者更好 projectNames 是一个列表,其中:
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)
]

或者我们可以为 Projects 创建一个空列表没有 PM和:
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)
]

关于python - Django查询集在查询中获取空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61375370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com