Alagappan Ramu
Alagappan Ramu

Reputation: 2358

Django Tastypie: Adding multiple models to a single Tastypie Resource

I have the following models in my Django Application. The BasicInfo and AddressInfo tables are linked to the Customer table using the id column of the Customer Table, which is the customer_id column in these tables.

For each customer, there can be multiple entries in the AddressInfo or the BasicInfo table.

class Customer(models.Model):
    id = models.IntegerField(primary_key=True)
    joining_dtm = models.DateTimeField()
    isactive = models.IntegerField()

    class Meta:
        db_table = u'Customer'


class Addressinfo(models.Model):
    id = models.IntegerField(primary_key=True)
    apt_num = models.CharField(max_length=135, blank=True)
    street = models.CharField(max_length=135, blank=True)
    street_2 = models.CharField(max_length=135, blank=True)
    city = models.CharField(max_length=135, blank=True)
    country = models.CharField(max_length=135, blank=True)
    postalcode = models.CharField(max_length=135, blank=True)
    customer_id = models.ForeignKey(Customer)

    class Meta:
        db_table = u'AddressInfo'

class Basicinfo(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=135, blank=True)
    about = models.CharField(max_length=135, blank=True)
    website = models.CharField(max_length=135, blank=True)
    customer_id = models.ForeignKey(Customer)

    class Meta:
        db_table = u'BasicInfo'

How do I create a single Tastypie resource which will enable me to provide all customer tables as an API.

The json object that the resource returns can be something similar to the following for the customer with id 12,

{
   "id": 12, 
   "joining_dtm": "2012-10-25T07:06:54.041528", 
   "resource_uri": "/public-api/api/v0.1a/customer/1/", 
   "AddressInfo": [
      {    
          "id":22,
          "apt_num": "54",
          "street": "Avondale Place",
          "street_2": "",
          "city": "Chicago",
          "country": "India",
          "postalcode": "600059",
          "customer_id": 12
       },
      {
          "id":96,
          "apt_num": "11",
          "street": "Infinite Loop",
          "street_2": "",
          "city": "Cupertino",
          "country": "USA",
          "postalcode": "123456",
          "customer_id": 12
       }
    ],

   "BasicInfo": [
      {
          "id": 33,
          "name": "My Full Name",
          "about": "Blah Blah Blah",
          "website": "http://google.com",
          "customer_id": 12
       },
      {
          "id": 147,
          "name": "My New Name",
          "about": "More Blah Blah",
          "website": "http://gmail.com",
          "customer_id": 12

       }
    ]
}

Upvotes: 2

Views: 1294

Answers (1)

sampson-chen
sampson-chen

Reputation: 47269

If you are simply asking for an API that lists all of your customers:

/public-api/api/v0.1a/customer/?format=json

Should give you that. Otherwise, below is what I assume you were asking - how to set up the resources to show basic info / address info when viewing a customer's endpoint

In your api.py:

class CustomerResource(ModelResource):
    # The 2nd parameter is tricky:
    # Try suffixing with nothing, 's', or '_set'
    # e.g. 'addressinfo', 'addressinfos', 'addressinfo_set'
    addressinfos = fields.ToManyField('your_app_name.api.AddressInfoResource', 'addressinfo_set', Full=True)
    basicinfos = fields.ToManyField('your_app_name.api.BasicInfoResource', 'basicinfo_set', Full=True)

    class Meta:
        queryset = Customer.objects.all()
        resource_name = 'customer'


class AddressInfoResource(ModelResource):

    class Meta:
        queryset = Addressinfo.objects.all()
        resource_name = 'addressinfo'


class BasicInfoResource(ModelResource):

    class Meta:
        queryset = Basicinfo.objects.all()
        resource_name = 'basicinfo'

And of course add authentication / authorization at each of these resources as needed.

Upvotes: 1

Related Questions