Django rest framework rest_框架访问中间模型中ManyToManyField的对象

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

我有一个病人模型。每个患者都可以有多个“病历”,可从“BodyPart”或“Medicin”等模型中选择:

使用内联线,我们可以很好地为每个患者添加记录:

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