繁体   English   中英

如何在Django-rest-framework中序列化具有自定义关系的2个模型?

[英]How to serialize 2 models with custom relationship in django-rest-framework?

我在数据库中有2个现有表,但我无权更改它们。 显示为以下模型。

class Prenames(models.Model):
    typ = models.DecimalField(max_digits=1, decimal_places=0, db_column='tprpretyp')
    code = models.DecimalField(max_digits=3, decimal_places=0, db_column='tprprecod')
    name = models.CharField(max_length=20, db_column='tprprenam')

class Profiles(models.Model):
    userid = models.CharField(max_length=6, db_column='rmsuserid')
    prename = models.CharField(max_length=4, db_column='rmsprenam', null=True)
    name = models.CharField(max_length=25, db_column='rmsname')
    surname = models.CharField(max_length=25, db_column='rmssurnam')

如果SQL我必须

SELECT * FROM Profiles left join Prenames on tprpretyp = int(rmsprenam/1000) and tprprecod = mod(rmsprenam,1000) WHERE trim(rmsuserid) = ?

我已经尝试过的事情:

from rest_framework import serializers
from .models import *

class PrenameSerializer(serializers.ModelSerializer):
    class Meta:
        model = Prenames
        fields = ('type', 'code', 'name')


class ProfileSerializer(serializers.ModelSerializer):
    prenames = PrenameSerializer(read_only=True)

    class Meta:
        model = Profile
        fields = ('userid', 'name', 'surname', 'prenames')

我得到的东西:

{
  "userid": "560174",
  "name": "******",
  "surname": "******"
}

我期望的事情:

{
  "userid": "560174",
  "name": "******",
  "surname": "******"
  "prenames":[
      {
          "type:":10,
          "code": 01,
          "name": "Mr."
      }
  ]
}

我正在使用django-rest-framework 3.2.5和django 1.6如何序列化它们?

尝试这个:

prenames = PrenameSerializer(source="how_you_get_this_field, many=True, read_only=True)

感谢@Aison给我的启发。 这个解决方案不是我想要的。 但这现在可以挽救我的生命。 SerializerMethodField 我决定将ProfileSerializer修改为

class PatientSerializer(serializers.ModelSerializer):
    prenameth = serializers.SerializerMethodField('getprenameth')
    prenameen = serializers.SerializerMethodField('getprenameen')

    def getprenameth(self, obj):
        return obj.prename.name

    def getprenameen(self, obj):
        return obj.prename.en_pre_name

    class Meta:
        model = Patients
        fields = ('userid', 'name', 'surname', 'prenames', 'prenameth', 'prenameen')

这就是我从中得到的。

{
  "userid": "560174",
  "name": "******",
  "surname": "******",
  "prenameth": "นาย",
  "prenameen": "Mr."
}

现在就足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM