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.py
ativada (dispositivo)Os usuários podem
CREATE
(registrar),UPDATE
(cancelar o registro),GET
seus dispositivos por meio da API RESTA implementação da API REST está
resources.py
ativada (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_id
campo 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_id
vez deid
urlsA
override_urls
funçã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
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 o
ModelResource.get_resource_uri
pk
device_id
A seguir está a implementação da
get_resource_uri
função
- Aqui
api_name
eresource_name
pegueMeta
. 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
- 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_urls
função em vez deoverride_urls
função
Mais informações
http://django-tastypie.readthedocs.org/en/latest/cookbook.html#using-non-pk-data-for-your-urls