django rest_framework如何显示嵌套关系

8yoxcaq7  于 2022-12-14  发布在  Go
关注(0)|答案(1)|浏览(111)

我正尝试显示与外国相关的字段,就像这个例子一样,它起作用了

{
    "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"
   } 
},

这是我已经尝试过的,tbh我不认为这将工作有一个解决这个问题的办法。
如果没有,我可能会添加额外的检查列,如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'
scyqe7ek

scyqe7ek1#

您已经定义了OneToOne字段名reqid,因此应将其用作序列化程序键。
注意到Django会将_id添加到字段中,这样它在数据库中就会变成reqid_id,最好将其命名为reqrequest,只是为了引用相关对象。

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',
        ]

相关问题