我正在尝试在疾病模型和证据模型中显示属性,但是在结束链接上显示的属性仅是规则模型中存在的那些属性。
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)
我想要完成的是显示疾病,证据和规则上存在的所有数据。
没有错误或崩溃,疾病模型和证据模型的值只是没有显示。
编辑:以前的答案是不正确的。更新了答案。
您在序列化程序中使用了错误的字段名称。以下是正确的:
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)