2011-11-23 7 views
6

Estoy empezando con django tastypie, y estoy entusiasmado con eso. Mi pregunta: Estoy buscando la misma característica que en la vista de administrador: especifique para los campos de clave externa qué ver en la lista respuesta de otros objetos y qué en la respuesta detallada.Django tastypie: Programa de recursos diferente en la solicitud detallada como en la solicitud de lista

digamos que este es mi modelo de simplyfied:

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) 

y estos son mis recursos para la 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() 

En el TimeseriesResource si utiliza full=False, que acaba de obtener una URL con una id, si utiliza full=True, obtendrá toda la información. En realidad, la ubicación tiene mucha más información. Necesito solo un poco más de información que full = 'False' pero no toda la información usando full=True. No quiero usar la opción de exclusión, porque no tengo la información en la información detallada o en la lista del objeto Ubicación en sí misma.

una de las opciones que estaba pensando, es hacer 2 recursos para el mismo objeto, pero esta no parece ser la mejor solución (pero supongo que funcionará). Por cierto: pensé en esta opción, no funcionará (por supuesto), mejor uso la solución utilizada en la respuesta de bmihelac (gracias).

Aunque ... tratando la solución ... me lleva a una nueva pregunta, ver:

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

Respuesta

5

No es una solicitud de función para los diferentes campos en show y index, alnong con alguna la discusión de cómo se podría implementar:

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

Hasta que esta característica es n ot incluido, tal vez usted puede ayudar con esta solución:

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

+1

incluye el fragmento en la respuesta y lo votaré :) – ashwoods

+0

Gracias, al menos sé que no busco más! La solución alternativa se ve bien (no es perfecta, pero debería funcionar) –

+0

¡Consulte mi respuesta para obtener una actualización maravillosa! – mlissner

0

Por cierto, me cambiaron a otro marco Django API restfull ver http://django-rest-framework.org/. Así que ya no estoy usando tastypie. Sin embargo, esta pregunta y respuesta probablemente aún sea útil para otros.

Encontré django-rest-framework mucho más fácil y más flexible en el camino para implementarlo. No he encontrado nada que no pueda hacer con este marco (bueno, no me trae café).

5

¡Buenas noticias! Esto ha sido agregado a tastypie.

Si desea configurar un campo para que esté solo en determinadas páginas, simplemente defina el atributo use_in como 'todo', 'lista' o 'detalle'.

información here más, pero voy a dar un ejemplo para la posteridad:

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

simple como eso!

Cuestiones relacionadas