【问题标题】:django rest_framework how to display nested relationshipdjango rest_framework 如何显示嵌套关系
【发布时间】:2022-12-19 16:42:07
【问题描述】:

我正在尝试像这个例子一样显示外国相关字段并且它有效

    {
    "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'
            ]

这是我的模型.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'

【问题讨论】:

  • isinspected 字段在哪里?
  • 如果请求的服务得到检查,它只是一个布尔字段

标签: django django-rest-framework django-serializer


【解决方案1】:

您已经定义了 OneToOne 字段名称 reqid 因此您应该将其用作序列化器键。

请注意,Django 会将_id 添加到该字段,因此它在您的数据库中将变为reqid_id,最好将其命名为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',
        ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2014-09-18
    • 2019-09-16
    • 2018-11-04
    相关资源
    最近更新 更多