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)
incluye el fragmento en la respuesta y lo votaré :) – ashwoods
Gracias, al menos sé que no busco más! La solución alternativa se ve bien (no es perfecta, pero debería funcionar) –
¡Consulte mi respuesta para obtener una actualización maravillosa! – mlissner