Dados não PK para URLs em tastypie

Sobre torta saborosa

  • Tastypie é a estrutura da API REST para Django

Mais informações – http://django-tastypie.readthedocs.org/en/latest/

Filtragem Tastypie

  • Ao usar o tastypie permite filtrar seus dados com a chave primária do modelo.

  • Considere o seguinte modelo de exemplo (dispositivo) e recurso (DeviceResource)

models.py
https://github.com/erangaeb/dev-notes/blob/master/django/models.py
resources.py
https://github.com/erangaeb/dev-notes/blob/master/django/resources .py

  • Esta é uma parte de um aplicativo django que escrevi para lidar com notificações push do Android por meio do Google Could Messaging (GCM)

  • Este aplicativo permite enviar notificações push para dispositivos registrados

  • A implementação do modelo está models.pyativada (dispositivo)

  • Os usuários podem CREATE(registrar), UPDATE(cancelar o registro), GETseus dispositivos por meio da API REST

  • A implementação da API REST está resources.pyativada (DeviceResource)

  • Esta API REST permite interagir com dispositivos via chave primária do modelo (identificada como id). Seguindo alguns exemplos de urls que expõem pela API REST

api/v1/devices/ - GET all devices, POST device
api
/v1/devices/1 - GET, UPDATE device with primary key '1'
  • De acordo com a definição do modelo, o device_idcampo também é um campo único (pode haver apenas um dispositivo para determinado device_id)
class Device(models.Model):
device_id
= models.CharField(max_length=64, unique=True)
  • E se precisarmos obter um dispositivo com dados device_id? Considere o seguinte exemplo
api/v1/devices/1b6396a7fa5ca96f - GET, UPDATE device with device id '1b6396a7fa5ca96f'
  • Aqui, precisamos ter em device_idvez de idurls

  • A override_urlsfunção de recurso tastypie permite implementar este tipo de filtragem de url

override_urls

  • A seguir está a implementação da função override_urls

Cenário

  • Neste exemplo, se a solicitação vier com o padrão de url, tastypie redirecionará a solicitação para a função (visualização).devices/<device_id>dispatch_detail

  • Em seguida, precisamos substituir o método para alterar a string para oModelResource.get_resource_uripkdevice_id

  • A seguir está a implementação da get_resource_urifunção

Cenário

  • Aqui api_namee resource_namepegue Meta. Em seguida, adicione a nova chave ( device_id) como uma substituição parapk
kwargs = {
'resource_name': self._meta.resource_name,
'api_name': self._meta.api_name
}

if isinstance(bundle_or_obj, Bundle):
kwargs
['device_id'] = bundle_or_obj.obj.device_id
else:
kwargs
['device_id'] = bundle_or_obj.device_id
  • A seguir está um exemplo de resposta após essa filtragem. Retorna o dispositivo com device_id 1b6396a7fa5ca96f

url

http://localhost:8000/api/v1/devices/1b6396a7fa5ca96f?format=json

resposta

Cenário

  • Observe que todas essas implementações são feitas com o tastypie versão 0.9.11
  • A última versão do tastypie contém prepend_urlsfunção em vez de override_urlsfunção

Mais informações
http://django-tastypie.readthedocs.org/en/latest/cookbook.html#using-non-pk-data-for-your-urls