Django Передача данных поля таблицы в сериализатор
У меня есть следующие модели:
class Disease(models.Model):
name = CICharField("Disease Name", max_length=200, unique=True)
symptoms = models.ManyToManyField(Symptom, through='DiseaseSymptom', related_name='diseases')
class Symptom(models.Model):
name = CICharField("Symptom Name", max_length=200, unique=True)
PRIORITY = (
(0, 'Normal'),
(1, 'Low'),
(2, 'Medium'),
(3, 'High'),
(4, 'Key'),
)
class DiseaseSymptom(models.Model):
disease = models.ForeignKey(Disease, on_delete=models.CASCADE, related_name='disease_to_symptom')
symptom = models.ForeignKey(Symptom, on_delete=models.CASCADE, related_name='symptom_to_disease')
priority = models.PositiveSmallIntegerField('Priority', choices=PRIORITY, default=0)
На фронт-энде у меня есть несколько полей выбора, где пользователи могут выбрать несколько симптомов, чтобы найти заболевание, и это будет передано в модель Disease как symptoms_selected params.
У меня есть следующий get_queryset на Disease > views.py
def get_queryset(self):
params = self.request.query_params
query_symptoms = self.request.GET.getlist('symptoms_selected')
if query_symptoms:
queryset = Pattern.objects.filter(
symptoms__id__in=query_symptoms
).annotate(
matches=Count('symptoms')
).order_by('-matches')
else:
queryset = Disease.objects.all()
return queryset
serializer_class = DiseaseSerializer
Я использую Django REST API для передачи данных результата.
class DiseaseSerializer(serializers.ModelSerializer):
symptoms_matches = serializers.SerializerMethodField()
class Meta:
model = Disease
fields = ('id', 'name','symptoms_matches')
def get_symptoms_matches(self, obj):
return getattr(obj, 'matches', None)
Например: Данные о заболевании:
Болезнь А: Симптомы: A (приоритет=4), B (приоритет=2), C (приоритет=3), D (приоритет=2)
Болезнь В: Симптомы: A (приоритет=1), D (приоритет=2), P (приоритет=4), Q (приоритет=2)
>Если пользователи выбирают 2 симптома: A, D. Я хочу, чтобы queryset возвращал количество ключевых симптомов (т.е. симптомов с приоритетом 4), сопоставленных с каждой болезнью, и сумму приоритетов симптомов в каждой болезни.
Например, если пользователь выбирает 2 симптома: A, D. Я хочу добиться того, чтобы сериализатор возвращал данные типа:
[
{
name: "Disease A"
key_symptoms_matched: 1
matched_symptoms_priority_sum: 6
}
{
name: "Disease B"
key_symptoms_matched: 0
matched_symptoms_priority_sum: 3
}
]
Может ли кто-нибудь сказать мне, как я могу этого достичь?
Я нашел способ подсчета общей суммы приоритетов симптомов в каждом заболевании
queryset = Disease.objects.filter(
symptoms__id__in=query_symptoms
).annotate(
matches=Count('symptoms')
).annotate(
matched_symptoms_priority_sum =Sum('disease_to_symptom__priority')
).order_by('-matches','-matched_symptoms_priority_sum')
Но мне все еще нужно количество ключевых симптомов, совпадающих в каждом заболевании?