Django rest framework rest_框架访问中间模型中ManyToManyField的对象
我有一个病人模型。每个患者都可以有多个“病历”,可从“BodyPart”或“Medicin”等模型中选择: 使用内联线,我们可以很好地为每个患者添加记录:Django rest framework rest_框架访问中间模型中ManyToManyField的对象,django-rest-framework,Django Rest Framework,我有一个病人模型。每个患者都可以有多个“病历”,可从“BodyPart”或“Medicin”等模型中选择: 使用内联线,我们可以很好地为每个患者添加记录: class MedicalRecordAdmin(admin.TabularInline): model = MedicalRecord extra = 1 class PatientAdmin(admin.ModelAdmin): model = Patient inlines = [MedicalReco
class MedicalRecordAdmin(admin.TabularInline):
model = MedicalRecord
extra = 1
class PatientAdmin(admin.ModelAdmin):
model = Patient
inlines = [MedicalRecordAdmin,]
...
admin.site.register(Patient, PatientAdmin)
...
我失败的地方是(已经通过,序列化程序.StringRelatedField(many=True)
,等等),如何从患者模型的侧面序列化这些关系
# view
class PatientViewSet(viewsets.ReadOnlyModelViewSet):
serializer_class = PatientSerializer
queryset = Patient.objects.all()
# serializer
class PatientSerializer(serializers.ModelSerializer):
class Meta:
model = Patient
fields = '__all__'
depth = 3
结束于:
[
{
"id": 1,
"name": "Bert"
}
]
## But I would expect something like:
[
{
"id": 1,
"name": "Bert",
"medical_records":[
[
{
"medicine": ["a","b","c"],
"body_part": "leg",
"examination": "x-ray"
}
],
[
{
"medicine": ["e","f","g"],
"body_part": "head",
"examination": "surgery"
}
],
]
}
]
您必须使用嵌套序列化程序并使用源字段来实现所需的结果 有点像这样:
class Patient(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Examination(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class BodyPart(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Medicin(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class MedicalRecord(models.Model):
patient = models.ForeignKey('Patient', on_delete=models.CASCADE, related_name='patient_med')
examination = models.ForeignKey('Examination', on_delete=models.CASCADE, related_name='examination_med')
part_of_body = models.ForeignKey('BodyPart', on_delete=models.CASCADE, relayted_name='part_of_body_med')
medicin = models.ManyToManyField('Medicin', related_name='medicin_med')
class MedicalRecordSerializer(serializers.ModelSerializer):
body_part = serializers.CharField(source='part_of_body.name', read_only=True)
examination = serializers.CharField(source='examination.name', read_only=True)
medicine = serializers.ListField(source='medicine.name', read_only=True)
class Meta:
model = MedicalRecord
fields = ('body_part', 'examination', 'medicine')
class PatientSerializer(serializers.ModelSerializer):
patient_med = MedicalRecordSerializer(many=True, read_only=True)
class Meta:
model = Patient
fields = '__all__'
depth = 3
非常感谢@Neeraj前来寻求帮助。这和我试过的相似。不幸的是,结果保持不变。病历不会作为嵌套依赖项呈现。看起来病人病历之间缺少某种联系。顺便说一句,我对这个模型解决方案不太满意。所以,在这种情况下,有一种更简单的方法可以附加无限的记录(包括身体部位、医疗、检查),我完全敞开了耳朵;)抱歉,在使用嵌套序列化程序并排除medicine=serializers.ListField()之后,您是否可以发送得到的响应?当然!我跳过URL,因为它只是默认路由器,不应该改变任何东西!在底部找到生成的JSON。只有名称(患者模型的一个字段)被序列化:/get的错误可能是因为我们没有指定源字段,这就是为什么它没有从患者模型中检测到医疗记录。尝试将医疗记录更改为:医疗记录=医疗记录序列化程序(源='patient\u set',many=True,read\u only=True)。或者您可以更改模型,为FK关系设置一些相关名称并使用它们。这看起来很有希望!不幸的是,这样做不会改变它:(“或者你可以更改模型,为FK关系设置一些相关名称并使用它们。”你能告诉我怎么做吗?真是个难题!
class Patient(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Examination(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class BodyPart(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class Medicin(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class MedicalRecord(models.Model):
patient = models.ForeignKey('Patient', on_delete=models.CASCADE, related_name='patient_med')
examination = models.ForeignKey('Examination', on_delete=models.CASCADE, related_name='examination_med')
part_of_body = models.ForeignKey('BodyPart', on_delete=models.CASCADE, relayted_name='part_of_body_med')
medicin = models.ManyToManyField('Medicin', related_name='medicin_med')
class MedicalRecordSerializer(serializers.ModelSerializer):
body_part = serializers.CharField(source='part_of_body.name', read_only=True)
examination = serializers.CharField(source='examination.name', read_only=True)
medicine = serializers.ListField(source='medicine.name', read_only=True)
class Meta:
model = MedicalRecord
fields = ('body_part', 'examination', 'medicine')
class PatientSerializer(serializers.ModelSerializer):
patient_med = MedicalRecordSerializer(many=True, read_only=True)
class Meta:
model = Patient
fields = '__all__'
depth = 3