Django tastypie: Resource show different in detailed request as in list request
Asked Answered
C

3

6

I Am just starting with django tastypie, and I Am enthousiastic about it. My question: I Am searching for the same feature as in the admin view: specify for foreignkey fields what to see in the list response of other objects and what in the detailed response.

let's say this is my simplyfied model:

class Location(models.Model):
    name = models.CharField(max_length=256, blank=True)
    longitude = models.FloatField(blank=True, default=0.0)
    latitude = models.FloatField(blank=True, default=0.0)
    description = models.CharField(max_length=256, blank=True)
    shortname = models.CharField(max_length=256, blank=True)
    tooltiptext = models.CharField(max_length=1000, blank=True)
    locationtype = models.ForeignKey(LocationType, blank=True, null=True)
    public_anonymous = models.BooleanField(default=False, blank=False, null=False)
    public_authorized = models.BooleanField(default=False, blank=False, null=False)
    def __str__(self):
        return '%s' % (self.name)

class Variable(models.Model):
    abbreviation = models.CharField(max_length=64, unique=True)    
    name = models.CharField(max_length=256, blank=True)
    unit = models.CharField(max_length=64, blank=True)
    def __str__(self):
        return '%s  [%s]' % (self.name, self.unit)

class Timeseries(models.Model):
    locationkey = models.ForeignKey(Location)
    variablekey = models.ForeignKey(Variable)
    tstypekey = models.ForeignKey(TimeseriesType)

    def __str__(self):
        return '%s: %s (%s)' % (self.locationkey.name, self.variablekey.name, self.tstypekey.name)

and these are my resources for the api:

class LocationResource(ModelResource):
    class Meta:
        queryset = Location.objects.all()
        resource_name = 'location'
        excludes = ['public_anonymous', 'public_authorized']
        authentication = BasicAuthentication()
        authorization = DjangoAuthorization()

class VariableResource(ModelResource):
    class Meta:
        queryset = Variable.objects.all()
        resource_name = 'variable'
        authentication = BasicAuthentication()
        authorization = DjangoAuthorization()

class TimeseriesTypeResource(ModelResource):
    class Meta:
        queryset = TimeseriesType.objects.all()
        resource_name = 'timeseriestype'
        authentication = BasicAuthentication()
        authorization = DjangoAuthorization()

class TimeseriesResource(ModelResource):
    location = fields.ForeignKey(LocationResource, 'locationkey', full=False) 
    variable = fields.ForeignKey(VariableResource, 'variablekey', full=False) 
    timeseriestype = fields.ForeignKey(TimeseriesTypeResource, 'tstypekey', full=False) 

    class Meta:
        queryset = Timeseries.objects.all()
        resource_name = 'timeseries'
        authentication = BasicAuthentication()
        authorization = DjangoAuthorization()

In the TimeseriesResource if you use full=False, you just get an url with an id, if you use full=True you get all the information. In real the location has a lot more information. I need just a bit more information than full='False' but not all the information using full=True. I do not want to use the exclude option, because than I do not have the information in the detailed information or in the list of the Location object itselve.

one of the options I was thinking about, is making 2 resources for the same object, but this doesn't feel like the best solution (but I guess it will work). By the way: I thought over this option, will not work (ofcourse), better use the workaround usggested in the answer of bmihelac (thanks).

Although... trying the workaround... leads me to a new question, see:

django-tastypie: Cannot access bundle.request in dehydrate(self,bundle)

Castaway answered 23/11, 2011 at 13:27 Comment(0)
D
5

There is a feature request for different fields in show and index, alnong with some discussion how it could be implemented:

https://github.com/toastdriven/django-tastypie/issues/18

Until this feature is not included, maybe you can help with this workaround:

https://github.com/toastdriven/django-tastypie/issues/18#issuecomment-2695447

Disobedience answered 23/11, 2011 at 17:53 Comment(1)
Thanks, at least I know not to search any further! The workaround looks good (not perfect, but it should do the trick)Castaway
P
5

Good news! This has been added to tastypie.

If you wish to set up a field to be only on certain pages, simply define the use_in attribute to be either 'all', 'list' or 'detail'.

More info here, but I'll provide an example for posterity:

class DocumentResource(ModelResource):
    my_field = fields.CharField(attribute='my_field', use_in='detail')

Simple as that!

Particularize answered 29/10, 2013 at 19:58 Comment(0)
C
0

By the way, I switched to another restfull django api framework see http://django-rest-framework.org/. So I Am not using tastypie anymore. Hoewever, this question and answer is probably still usefull to others.

I found django-rest-framework a lot easier and more flexibel in the way to implement it. I haven't found anything I could not do with this framework (well, it does not bring me coffee).

Castaway answered 9/9, 2013 at 7:8 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.