Попытка автоматического заполнения атрибутов модели с помощью Django rest framework
Введение: У меня есть 2 модели Patient
и Embryo
Существует только 1 пользователь, который является суперпользователем. Все пациенты принадлежат суперпользователю. У одного пациента может быть много эмбрионов, но у эмбриона может быть только один пациент.
Чего я хочу достичь Модель Embryo имеет поле под названием karyotes
, которое является Charfield
. когда пользователь вводит karyotes
, sex
эмбриона заполняется автоматически. То же самое с синдромом Дауна (см. Модели ниже)
Ошибка: То, как я сделал свои модели. sex
и down_syndrome
всегда показывают ноль
Example (This is not code, just explanation )
if karyotype == "46,XX" #The embryo is a Female
if karyotype == "46,XY" #The embryo is a Male
if karyotype == "47,XY,+21" #The embryo is a Male and has Down Syndrome
if karyotype == "47,XX,+21" #The embryo is a Female and has Down Syndrome
else sex == null and down_syndrome == null
Ниже представлены мои модели
class PatientsApiView(viewsets.ModelViewSet):
""" Handles Creating, reading and updating Patients """
class Embryo(models.Model):
""" A ForeignKey model to the patient """
patient = models.ForeignKey(Patient, related_name="embryos", on_delete=models.CASCADE)
code_name = models.CharField(max_length=100)
karyotype = models.CharField(max_length=100)
down_syndrome = models.BooleanField(blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
GENDER_CHOICES = (
("M", "Male"),
("F", "Female"),
)
sex = models.CharField(blank=True, null=True, max_length=1, choices=GENDER_CHOICES)
def __str__(self):
return self.code_name
""" Below is my attempt to get the desired result """
def get_sex(self):
if self.karyotype == "46,XX":
return self.sex == "F"
elif self.karyotype == "46,XY":
return self.sex == "M"
def has_down_syndrome(self):
if self.karyotype == "47,XY,+21":
return self.down_syndrome == True and self.sex == "M"
elif self.karyotype == "47,XX,+21":
return self.down_syndrome == True and self.sex == "F"
else:
return self.down_syndrome == False and self.sex == null
Ниже приведены мои views.py
class EmbroApiView(viewsets.ModelViewSet):
"""Handles Creating, reading and updating Patients"""
serializer_class = serializers.EmbryoSerializer
queryset = Embryo.objects.all()
authentication_classes = (TokenAuthentication,)
filter_backends = (filters.SearchFilter,)
permission_classes = (IsAuthenticated,)
search_fields = ("code_name", "karyotype", "sex", "down_syndrome",)
def perform_create(self, serializer):
serializer.save(pk=self.kwargs.get("pk"))
ниже мои serializers.py
class EmbryoSerializer(serializers.ModelSerializer):
class Meta:
model = Embryo
fields = ("id", "patient", "code_name", "karyotype", "sex", "down_syndrome", "created_at", "updated_at")
extra_kwargs = {"sex": {"read_only": True},
"down_syndrome": {"read_only": True}
}
Согласно 1-му совету @Ruddra