1

Django rest frame - get two models

 2 years ago
source link: https://www.codesd.com/item/django-rest-frame-get-two-models.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Django rest frame - get two models

advertisements

I have multiple models that are associated by Foreign Keys. I can export them all separately using django rest framework on a one to one basis, and I can also export multiple ones nested. However I want to be able to essentially "concatenate" them together into a single json/xml export.

The models in the example below are joined by a one to one foreign key on jobdtl_id. I have some where it's one to many but I'm hoping I can figure that out when I know how to get a view that will link 2 separate models like I want below -

Here's an example of what I want the json to look like by hitting a single URL like

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

The models are basically like this -

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'

end caveat I'm converting the json from how the XML looks for the existing legacy app which is like so -

<?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>


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',  ...)

Would result in a more correct data structure of

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

}




About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK