W moim kodzie są modele podobne do następujących:
class CompanyProject(models.Model):
""" This class holds project related information read in from the 'project'
custom 'manage.py' command.
"""
project_number = models.IntegerField(blank=False, null=False, unique=True)
project_worktype = models.CharField(blank=True, max_length=255, null=True)
created_at = models.DateTimeField(auto_now_add=True, blank=False, null=False)
updated_at = models.DateTimeField(auto_now=True, blank=False, null=False)
last_seen = models.DateField(blank=False, null=False)
def get_project_subtypes(self):
subtypes = self.project_subtype.all()
return [ subtype.project_subtype for subtype in subtypes ]
class Meta:
ordering = ['project_number']
class CompanySubType(models.Model):
class CompanySubTypeChoices(models.TextChoices):
G1A = '1A', _('1A')
G1B = '1B', _('1B')
G2A = '2A', _('2A')
G2B = '2B', _('2B')
G3A = '3A', _('3A')
G3B = '3B', _('3B')
company_project = models.ManyToManyField(CompanyProject, related_name='project_subtype')
project_subtype = models.CharField(blank=False, choices=CompanySubTypeChoices.choices, max_length=2, null=False)
class ListEntry(models.Model):
list_project = models.OneToOneField(CompanyProject, on_delete=models.CASCADE, related_name='list_project')
list_reviewer = models.ForeignKey('auth.User', on_delete=models.CASCADE, related_name='+')
Chciałbym zwrócić zestaw аннотированных ListEntry
obiekty wyposażone listą WSZYSTKICH podtypów projektu, zidentyfikowanych za pomocą ListEntry
projekt.
W końcu, trzeba będzie przekazać te аннотированные dane w serializacja frameworka Django REST, ale najpierw muszę adnotacje pracował tak, jak chcę.
Mój problem polega na tym, że umiem komentować, robi coś takiego:
list_entry_qs = ListEntry.objects.prefetch_related('list_project', 'list_reviewer').annotate(subtypes=F('list_pmatt__project_subtype__project_subtype')).all()
i to działa dobrze. Problem, z którym spotykam, polega na tym, że zestaw zapytań, zwrotny tym zespołem, powiela list_entry
obiekt, jeśli ma więcej niż jeden subtype
streszczenie.
Na przykład, jeśli projekt pod numer 1234 ma dwa podtypy projektu "1A" i "3A", mam dwa list_entry
obiekty: jeden z subtype
streszczenie "1A" i prywatne list_entry
obiekt do jednego i tego samego projektu z subtype
streszczenie "3A".
Chciałbym, aby do projektu 1234 został zwrócony JEDEN obiekt, który ma subtype
adnotacje '1A', '2A', które w końcu będą сериализованы do obiektu JSON.
Musi być w prosty sposób to zrobić?