Django rest_framework как отобразить вложенные отношения

Я пытаюсь отобразить иностранные связанные поля, как в этом примере, и это работает

    {
    "reqid": 10,
    "reqdate": "2022-12-05",
    "reqdescription": "Aircon Not working",
    "officerequestor": "OVCAA   ",
    "officeid": "PPD      ",
    "inspection": {
        "insdate": "2022-12-06",
        "diagnosis": "need to buy prism",
        "inspector": "EMP-322 "
    }
},

это мой serializers.py

class RequestAdditionDetailsSerializer(serializers.ModelSerializer):
class Meta:
    model = Inspection
    fields = ['insdate',
            'diagnosis',
            'inspector'
            ]

class RequestorSerializer(serializers.ModelSerializer):
inspection = RequestAdditionDetailsSerializer(read_only=True)
class Meta:
    model = Request
    fields = ['reqid',
            'reqdate',
            'reqdescription',
            'officerequestor',
            'officeid',
            'inspection'
            ]

Мой вопрос в том, могу ли я сделать это наоборот следующим образом

    {
"inspectid": 5,
"reqid": "10",
"insdate": "2022-12-06",
"diagnosis": "need to buy prism",
"inspector": "EMP-322",
"isinspected": {
    "reqdescription": "Aircon Not working",
    "reqdate": "2022-12-05",
    "officerequestor": "OVCAA"
   } 
},

вот что я пробовал, но я не думаю, что это сработает, есть ли решение для этого.

если нет, возможно, я добавлю дополнительные колонки в инспекцию, такие как reqdescription, reqdate и т.д., просто чтобы показать их

class InspectionAdditionalDetailsViewSerializer(serializers.ModelSerializer):
class Meta:
    model = Request
    fields = ['reqdescription',
            'reqdate',
            'officerequestor'
            ]

class InspectionSerializer(serializers.ModelSerializer):
request_details = InspectionAdditionalDetailsViewSerializer(read_only=True)
class Meta:
    model = Inspection
    fields = ['inspectid',
            'reqid',
            'insdate',
            'diagnosis',
            'inspector',
            'isinspected',
            'request_details'
            ]

вот мой models.py

class Inspection(models.Model):
inspectid = models.AutoField(primary_key=True)
reqid = models.OneToOneField('Request', models.DO_NOTHING, db_column='reqid', blank=True, null=True)

class Meta:
    managed = False
    db_table = 'inspection'

class Request(models.Model):
reqid = models.AutoField(primary_key=True)

class Meta:
    managed = False
    db_table = 'request'

Вы определили имя поля OneToOne reqid, поэтому вы должны использовать его в качестве ключа сериализатора.

Отметим, что Django добавит _id к полю, так что оно станет reqid_iq в вашей базе данных, лучше назвать его req или request только для ссылки на связанный объект.

class InspectionAdditionalDetailsViewSerializer(serializers.ModelSerializer):
    class Meta:
        model = Request
        fields = [
            'reqdescription',
            'reqdate',
            'officerequestor'
        ]

class InspectionSerializer(serializers.ModelSerializer):
    reqid = InspectionAdditionalDetailsViewSerializer(read_only=True)
    class Meta:
        model = Inspection
        fields = [
            'inspectid',
            'reqid',
            'insdate',
            'diagnosis',
            'inspector',
            'isinspected',
        ]
Вернуться на верх