Затем вы должны сделать это противоположным способом:
result = list(Project.objects.values(
'description',
<b>ProjectName=F('pm__PMNumber')</b>
))
Для Project
s, для которых не существует PM
, None
будет использоваться для ProjectName
. Если есть несколько PM
s для одного и того же Project
, будут добавлены все эти PM
s.
При этом я не понимаю, почему вы устанавливаете related_name
в realted_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",
<b>related_name='pm_set'</b>
)
Затем вы запросите:
result = list(Project.objects.values(
'description',
<b>ProjectName=F('pm_set__PMNumber')</b>
))
Вы можете заменить отсутствующее ProjectName
с description
проекта с:
from django.db.models.functions import Coalesce
result = list(Project.objects.values(
'description',
<b>ProjectName=Coalesce('pm_set__PMNumber', 'description')</b>
))
Вы также можете пост-обработать список в словарь, содержащий словари, где projectName
(или, возможно, лучше projectNames
является список , с:
from itertools import groupby
from operator import itemgetter
from django.db.models.functions import Coalesce
result = list(Project.objects.values(
'description',
<b>ProjectName=Coalesce('pm_set__PMNumber', 'description')</b>
)<b>.order_by('description')</b>)
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',
<b>ProjectName=F('pm_set__PMNumber')</b>
)<b>.order_by('description')</b>)
result = [
{ 'description': k, 'projectNames': list(filter(None, map(itemgetter('projectName'), vs))) }
for k, vs in groupby(itemgetter('description'), result)
]