0

외래 키와 연관된 여러 모델이 있습니다. 난 장고 나머지 프레임 워크를 사용하여 1 대 1 단위로 모두 그들을 내보낼 수 있으며, 또한 중첩 된 여러 것들을 내보낼 수 있습니다. 그러나 나는 본질적으로 이들을 하나의 json/xml 내보내기로 "연결"할 수 있기를 원합니다.django rest framework - 두 모델 얻기

아래 예제의 모델은 jobdtl_id에서 일대일 외래 키로 결합됩니다. 나는 하나에서 많은 것들을 가지고 있지만, 나는 아래처럼 2 개의 분리 된 모델을 연결하는 뷰를 얻는 방법을 알기를 희망한다. -

다음은 내가 원하는 json의 예제이다.

http://localhost/job/4/

{ 
    "job": { 
    "-id": "9878", 
    "-name": "This is the job", 
    "-master": "blahserver", 
    "-dbversion": "234", 
    "-xmlversion": "1", 
    "jobmst": { 
     "jobmst_id": "9878", 
     "jobmst_type": "2", 
     "jobmst_prntid": "234", 
     "jobmst_active": "Y", 
     "jobmst_name": "This is the job", 
     "jobmst_owner": "Owner", 
     "jobdtl_id": "9878", 
     "jobmst_lstchgtm": { 
     "-date": "Y", 
     "#text": "2013-10-23 09:22:08.0" 
     }, 
     "jobmst_prntname": "Parent", 
     "jobmst_alias": "9878" 
    }, 
    "jobdtl": { 
     "jobdtl_id": "9878", 
     "jobdtl_cmd": "blah.exe", 
     "jobdtl_failalarm": "NULL", 
     "nodmst_id": "NULL", 
     "nodlstmst_id": "NULL", 
     "jobdtl_inhevent": "Y", 
     "jobdtl_inhoptions": "Y", 
     "jobdtl_inhagent": "Y", 
     "jobdtl_inhrepeat": "Y", 
     "jobdtl_inhtime": "Y", 
     "jobdtl_timewin": "NULL", 
     "jobdtl_saveoutput": "Y", 
     "jobdtl_outputname": "NULL", 
     "jobdtl_trackmethod": "1", 
     "jobdtl_trackcmd": "NULL", 
     "jobdtl_deplogic": "1", 
     "jobdtl_rerun": "NULL", 
     "jobdtl_params": "--blah --ok" 
    }, 
    "jobdep": [ 
     { 
     "jobdep_id": "79670", 
     "jobmst_id": "9878", 
     "jobdep_type": "1", 
     "jobdep_jobmst": "another job", 
     "varmst_id": "NULL" 
     }, 
     { 
     "-num": "2", 
     "jobdep_id": "83783", 
     "jobmst_id": "9878", 
     "jobdep_type": "1", 
     "jobdep_jobmst": "and another", 
     "varmst_id": "NULL" 
     } 
    ], 
    "trgjob": [ 
     { 
     "trgjob_id": "22286", 
     "trgmst_id": "23455", 
     "jobmst_id": "9878" 
     }, 
     { 
     "-num": "2", 
     "trgjob_id": "28980", 
     "trgmst_id": "23521", 
     "jobmst_id": "9878" 
     }, 
     { 
     "-num": "3", 
     "trgjob_id": "28981", 
     "trgmst_id": "9237", 
     "jobmst_id": "9878" 
     } 
    ] 
    } 
} 

같은 하나의 URL을 쳐서처럼 보이는 모델은 다음과 같이 기본적으로 있습니다 -

class Jobdtl(models.Model): 
    jobdtl_id = models.IntegerField(primary_key=True) 
    jobdtl_cmd = models.TextField(blank=True) 
    .... 
    jobdtl_duration = models.IntegerField(blank=True, null=True) 
    class Meta: 
     managed = False 
     db_table = 'jobdtl' 

class Jobmst(models.Model): 
    jobmst_id = models.IntegerField(primary_key=True) 
    jobmst_type = models.SmallIntegerField() 
    .... 
    jobdtl_id = models.ForeignKey('Jobdtl', db_column='jobdtl_id', related_name='mstdtl', blank=True, null=True) 
    def __unicode__(self): 
     return self.jobmst_name 
    class Meta: 
     managed = False 
     db_table = 'jobmst' 

최종주의 내가 convertin 해요 g는 XML 지금처럼 기존의 레거시 앱의 모습에서 JSON -

<?xml version="1.0"?> 
<job id="9878" name="This is the job" master="blahserver" dbversion="532" xmlversion="1"> 
    <jobmst> 
     <jobmst_id>9878</jobmst_id> 
     <jobmst_type>2</jobmst_type> 
     <jobmst_prntid>234</jobmst_prntid> 
     <jobmst_active>Y</jobmst_active> 
     <jobmst_name>This is the job</jobmst_name> 
     <jobmst_owner>Owner</jobmst_owner> 
     <jobdtl_id>9878</jobdtl_id> 
     <jobmst_lstchgtm date="Y">2013-10-23 09:22:08.0</jobmst_lstchgtm> 
     <jobmst_prntname>Parent</jobmst_prntname> 
     <jobmst_alias>9878</jobmst_alias> 
    </jobmst> 
    <jobdtl> 
     <jobdtl_id>9878</jobdtl_id> 
     <jobdtl_cmd>blah.exe</jobdtl_cmd> 
     <jobdtl_failalarm>NULL</jobdtl_failalarm> 
     <nodmst_id>NULL</nodmst_id> 
     <nodlstmst_id>NULL</nodlstmst_id> 
     <jobdtl_inhevent>Y</jobdtl_inhevent> 
     <jobdtl_inhoptions>Y</jobdtl_inhoptions> 
     <jobdtl_inhagent>Y</jobdtl_inhagent> 
     <jobdtl_inhrepeat>Y</jobdtl_inhrepeat> 
     <jobdtl_inhtime>Y</jobdtl_inhtime> 
     <jobdtl_timewin>NULL</jobdtl_timewin> 
     <jobdtl_saveoutput>Y</jobdtl_saveoutput> 
     <jobdtl_outputname>NULL</jobdtl_outputname> 
     <jobdtl_trackmethod>1</jobdtl_trackmethod> 
     <jobdtl_trackcmd>NULL</jobdtl_trackcmd> 
     <jobdtl_deplogic>1</jobdtl_deplogic> 
     <jobdtl_rerun>NULL</jobdtl_rerun> 
     <jobdtl_params>--blah --ok</jobdtl_params> 
    </jobdtl> 
    <jobdep> 
     <jobdep_id>79670</jobdep_id> 
     <jobmst_id>9878</jobmst_id> 
     <jobdep_type>1</jobdep_type> 
     <jobdep_jobmst>another job</jobdep_jobmst> 
     <varmst_id>NULL</varmst_id> 
    </jobdep> 
    <jobdep num="2"> 
     <jobdep_id>83783</jobdep_id> 
     <jobmst_id>9878</jobmst_id> 
     <jobdep_type>1</jobdep_type> 
     <jobdep_jobmst>and another</jobdep_jobmst> 
     <varmst_id>NULL</varmst_id> 
    </jobdep> 
    <trgjob> 
     <trgjob_id>22286</trgjob_id> 
     <trgmst_id>23455</trgmst_id> 
     <jobmst_id>9878</jobmst_id> 
    </trgjob> 
    <trgjob num="2"> 
     <trgjob_id>28980</trgjob_id> 
     <trgmst_id>23521</trgmst_id> 
     <jobmst_id>9878</jobmst_id> 
    </trgjob> 
    <trgjob num="3"> 
     <trgjob_id>28981</trgjob_id> 
     <trgmst_id>9237</trgmst_id> 
     <jobmst_id>9878</jobmst_id> 
    </trgjob> 
</job> 
+0

json이 아닙니다. 결과 배열이 필요합니까? 또는 두 모델을 나열하는 부모 개체? 커스텀 시리얼 라이저가 읽기 전용 일 때 쉽습니다. 읽기/쓰기 복합 serializer는 누군가 작업을합니다. –

+0

json을 업데이트하여 더 이해하기를 바랍니다. 예, 읽기 전용이어야합니다. – whoisearth

+0

@whoisearth 열림/닫음 중괄호의 수가 일치하지 않으므로 정확한 json 구조가 무엇인지 알아내는 것이 어렵습니다.이 문제를 해결할 수 있습니까? – mariodev

답변

0

의보다 정확한 데이터 구조를 초래 나는 수행하여 해결책을 발견 내 views.py에서 다음

... 
@csrf_exempt   
def tesxml_test(request, pk): 
    """ 
    Retrieve, update or delete a code snippet. 
    """ 
    try: 
     mst = Jobmst.objects.using('database1').get(jobmst_id=pk) 
     dtl = Jobdtl.objects.using('database1').get(jobdtl_id=pk) 
     dep = Jobdep.objects.using('database2').filter(jobmst_id=pk).order_by('jobdep_id') 
     trg = Trgjob.objects.using('database1').filter(jobmst_id=pk).order_by('trgjob_order') 
    except Jobmst.DoesNotExist: 
     return HttpResponse(status=404) 

    if request.method == 'GET': 
     #Get String Results of 4 queries 
     jobmststring = JobmstSerializer(mst) 
     jobdtlstring = JobdtlSerializer(dtl) 
     jobdepstring = JobdepSerializer(dep) 
     trgjobstring = TrgjobSerializer(trg) 
     #Get serialized Results of 4 queries 
     jobmst_serialized = {'jobmst': jobmststring.data} 
     jobdtl_serialized = {'jobdtl': jobdtlstring.data} 
     jobdep_serialized = {'jobdep': jobdepstring.data} 
     trgjob_serialized = {'trgjob': trgjobstring.data} 

     jobgroup = jobmst_serialized, jobdtl_serialized, jobdep_serialized, trgjob_serialized, 


     jobgroupresponse = TESXMLResponse(jobgroup) 
     return jobgroupresponse 
... 

그것은 완벽 하진하지만 정의되어 내 문제의 다음 단계에 저를두고 렌더러는 내가 다른 질문을 가지고있는 루트 필드에서 데이터를 얻습니다. :)

0
class MSTSerializer(serializers.HyperlinkedModelSerializer): 
    jobdtl_id = DTLSerializer() 
    class Meta: 
     model = Jobmst 
     fields = ('id', 'url', 'jobdtl_id'...) 

class DTLSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Jobdtl 
     fields = ('id', 'url', ...) 

{ 
    "jobmst_id": 4, 
    "jobmst_type": 1, 
    "jobdtl_id": { 
     "jobdtl_id": 4, 
     "jobdtl_cmd": null, 
     "jobdtl_duration": 1379 
    }, 

} 
+0

그래, 내가 현재하고있는 일이지만 2 가지 문제가있다. – whoisearth

+0

그래, 내가 현재하고있는 일이지만 2 가지 문제가있다. 1. 반드시 jobdtl_id를 다음 모델에 연결하여 필요하지 않은 계층 구조를 만듭니다. 2. 일부 외래 키의 순서가 항상 같은 방향이 아닙니다. 이상적으로 나는 http : // localhost/job/4 /에서 펀치 할 수 있고 jobmst_id 컬럼과 관련된 모든 테이블을 얻을 수 있기를 원합니다. 일부 테이블은 여러 값을 반환 할 수도 있고 결국 아무 것도 반환하지 않을 수도 있습니다. 결국 기본적으로 개별 json을 모두 1로 연결하는 초기 질문과 같이 표시해야합니다. – whoisearth

관련 문제