0

У меня есть несколько моделей, которые связаны с внешними ключами. Я могу экспортировать их все отдельно, используя фреймворк django rest по отдельности, и я также могу экспортировать несколько вложенных. Однако я хочу иметь возможность «объединить» их вместе в один экспорт json/xml.django rest framework - получить две модели

Модели в приведенном ниже примере объединены одним-на-иностранным ключом на jobdtl_id. У меня есть некоторые, где это один для многих, но я надеюсь, что смогу понять это, когда я знаю, как получить представление, которое свяжет две отдельные модели, как я хочу ниже -

Вот пример того, что я хочу json выглядеть ударяя один URL, как

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" 
     } 
    ] 
    } 
} 

модели, в основном, как это -

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 г, то JSON от того, как XML выглядит для существующего унаследованного приложения, которое походит так -

<?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, вам нужен массив результатов? Или родительский объект, который перечисляет две модели? Это легко сделать с помощью пользовательского сериализатора, поскольку он доступен только для чтения. Считывание/запись сложных сериализаторов заставляет кого-то работать. –

+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 
... 

это не идеально, но это ставит меня на следующий шаг моей проблемы, которая CUSTOMIZING рендеринга, чтобы получить данные в корневых полях, у которых у меня есть другой вопрос SO для:

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. Некоторые приказы foreignkey не всегда в одном направлении. В идеале я хочу иметь возможность пробивать в http: // localhost/job/4/и получать все связанные таблицы, которые у меня есть с столбцом jobmst_id. Некоторые таблицы могут возвращать несколько значений, а некоторые нет, но в конце я хочу, чтобы все это отображалось как мой первоначальный вопрос, который в основном объединяет отдельный json все вместе в 1. – whoisearth

Смежные вопросы