嵌套关系序列化程序 Rest Framework 未正确显示
Nested Relationship Serializer Rest Framework Not Displaying Properly
我正在尝试显示疾病模型和证据模型中的属性,但最后显示的属性 link 只是规则模型中存在的那些属性。
Models.py :-
class Rule(models.Model):
disease = models.ForeignKey(Disease, default=0,related_name="DRules")
evidence = models.ForeignKey(Evidence, default=0,related_name="ERules")
measure_of_belief = models.PositiveIntegerField( \
help_text="The measure of belief (percentage) that a disease is present given this evidence exists", \
default=0,validators=[MinValueValidator(0), MaxValueValidator(100)])
measure_of_disbelief = models.PositiveIntegerField( \
help_text="The measure of disbelief (percentage) that a disease is present given an evidence does not exists", \
default=0,validators=[MinValueValidator(0), MaxValueValidator(100)])
archived = models.BooleanField(default=False)
def __str__(self):
return "{}-{}".format(self.disease, self.evidence)
class Meta:
verbose_name = "Rule"
verbose_name_plural = "Rules"
unique_together = ('disease', 'evidence',)
class Disease(models.Model):
"""
The model where the category will be stored
"""
name = models.CharField(max_length=255)
advise = models.CharField(max_length=500,blank=True)
archived = models.BooleanField(default=False)
def __str__(self):
return self.name
class Meta:
verbose_name = "Disease"
verbose_name_plural = "Diseases"
class Evidence(models.Model):
evidence_choices = {
("Observable Evidence", ("Observable Evidence")),
("Cause", ("Cause"))
}
name = models.CharField(max_length=255)
question = models.CharField(max_length=500)
evidence_type = models.CharField(choices = evidence_choices,max_length=20,default="Observable Evidences")
archived = models.BooleanField(default=False)
image_name = models.ImageField(upload_to='media/', default='media/None/no-img.jpg')
def __str__(self):
return self.name
class Meta:
verbose_name = "Evidence"
verbose_name_plural = "Evidences"
Serializers.py
class DiseaseSerializer(serializers.ModelSerializer):
class Meta:
model = Disease
fields = '__all__'
class EvidenceSerializer(serializers.ModelSerializer):
class Meta:
model = Evidence
fields = '__all__'
class RuleSerializer(serializers.ModelSerializer):
DRules = DiseaseSerializer(many=True,read_only=True)
ERules = EvidenceSerializer(many=True,read_only=True)
class Meta:
model = Rule
fields = ('measure_of_belief','disease','evidence','DRules','ERules')
views.py:-
class ShowDiseaseProfile(APIView):
def get(self,request,profileid):
profile = Rule.objects.filter(
disease_id=profileid)
serializer = RuleSerializer(
profile,many=True)
return Response(serializer.data)
我想要完成的是显示有关疾病、证据和规则的所有数据。
没有错误或崩溃,疾病模型和证据模型的值没有显示。
Here's the result
编辑:之前的回答不正确。更新了答案。
您在序列化程序中使用了不正确的字段名称。以下是正确的:
class RuleSerializer(serializers.ModelSerializer):
disease = DiseaseSerializer(many=True,read_only=True)
evidence = EvidenceSerializer(many=True,read_only=True)
class Meta:
model = Rule
fields = ('measure_of_belief','disease','evidence','DRules','ERules')
related_name 外键字段上的参数用于反向查找。查看文档以获得正确的解释。例如:
disease = Disease.objects.get(id=200)
d_rules = disease.DRules.all()
使用select_related查询优化sql查询。 Select 相关使用连接在一次 sql 操作中获取数据。
class ShowDiseaseProfile(APIView):
def get(self,request,profileid):
profile = (Rule.objects.filter(disease_id=profileid)
.select_related('disease', 'evidence'))
serializer = RuleSerializer(
profile,many=True)
return Response(serializer.data)
我正在尝试显示疾病模型和证据模型中的属性,但最后显示的属性 link 只是规则模型中存在的那些属性。
Models.py :-
class Rule(models.Model):
disease = models.ForeignKey(Disease, default=0,related_name="DRules")
evidence = models.ForeignKey(Evidence, default=0,related_name="ERules")
measure_of_belief = models.PositiveIntegerField( \
help_text="The measure of belief (percentage) that a disease is present given this evidence exists", \
default=0,validators=[MinValueValidator(0), MaxValueValidator(100)])
measure_of_disbelief = models.PositiveIntegerField( \
help_text="The measure of disbelief (percentage) that a disease is present given an evidence does not exists", \
default=0,validators=[MinValueValidator(0), MaxValueValidator(100)])
archived = models.BooleanField(default=False)
def __str__(self):
return "{}-{}".format(self.disease, self.evidence)
class Meta:
verbose_name = "Rule"
verbose_name_plural = "Rules"
unique_together = ('disease', 'evidence',)
class Disease(models.Model):
"""
The model where the category will be stored
"""
name = models.CharField(max_length=255)
advise = models.CharField(max_length=500,blank=True)
archived = models.BooleanField(default=False)
def __str__(self):
return self.name
class Meta:
verbose_name = "Disease"
verbose_name_plural = "Diseases"
class Evidence(models.Model):
evidence_choices = {
("Observable Evidence", ("Observable Evidence")),
("Cause", ("Cause"))
}
name = models.CharField(max_length=255)
question = models.CharField(max_length=500)
evidence_type = models.CharField(choices = evidence_choices,max_length=20,default="Observable Evidences")
archived = models.BooleanField(default=False)
image_name = models.ImageField(upload_to='media/', default='media/None/no-img.jpg')
def __str__(self):
return self.name
class Meta:
verbose_name = "Evidence"
verbose_name_plural = "Evidences"
Serializers.py
class DiseaseSerializer(serializers.ModelSerializer):
class Meta:
model = Disease
fields = '__all__'
class EvidenceSerializer(serializers.ModelSerializer):
class Meta:
model = Evidence
fields = '__all__'
class RuleSerializer(serializers.ModelSerializer):
DRules = DiseaseSerializer(many=True,read_only=True)
ERules = EvidenceSerializer(many=True,read_only=True)
class Meta:
model = Rule
fields = ('measure_of_belief','disease','evidence','DRules','ERules')
views.py:-
class ShowDiseaseProfile(APIView):
def get(self,request,profileid):
profile = Rule.objects.filter(
disease_id=profileid)
serializer = RuleSerializer(
profile,many=True)
return Response(serializer.data)
我想要完成的是显示有关疾病、证据和规则的所有数据。
没有错误或崩溃,疾病模型和证据模型的值没有显示。
Here's the result
编辑:之前的回答不正确。更新了答案。
您在序列化程序中使用了不正确的字段名称。以下是正确的:
class RuleSerializer(serializers.ModelSerializer):
disease = DiseaseSerializer(many=True,read_only=True)
evidence = EvidenceSerializer(many=True,read_only=True)
class Meta:
model = Rule
fields = ('measure_of_belief','disease','evidence','DRules','ERules')
related_name 外键字段上的参数用于反向查找。查看文档以获得正确的解释。例如:
disease = Disease.objects.get(id=200)
d_rules = disease.DRules.all()
使用select_related查询优化sql查询。 Select 相关使用连接在一次 sql 操作中获取数据。
class ShowDiseaseProfile(APIView):
def get(self,request,profileid):
profile = (Rule.objects.filter(disease_id=profileid)
.select_related('disease', 'evidence'))
serializer = RuleSerializer(
profile,many=True)
return Response(serializer.data)