嵌套关系序列化器休息框架未正确显示

问题描述 投票:1回答:1

我正在尝试在疾病模型和证据模型中显示属性,但是在结束链接上显示的属性仅是规则模型中存在的那些属性。

models.朋友 :-

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"

serialize认识.朋友

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.朋友:-

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

python django django-rest-framework django-serializer
1个回答
0
投票

编辑:以前的答案是不正确的。更新了答案。

您在序列化程序中使用了错误的字段名称。以下是正确的:

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 param用于反向查找。查看文档以获得正确的解释。例如:

disease = Disease.objects.get(id=200)
d_rules = disease.DRules.all()

使用select_related查询来优化sql查询。选择related使用连接在一个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)
© www.soinside.com 2019 - 2024. All rights reserved.