Exponiendo el método del modelo con Tastypie.

Actualmente estoy trabajando en la implementación de una API en mi proyecto Django y Tastypie parecía que sería lo más adecuado.

Lo que parece que no puedo resolver es cómo exponer una función dentro de mi modelo usando Tastypie.

Por ejemplo, tengo este modelo:

class game(models.Model): id = models.AutoField("ID", primary_key=True, editable=False) ip_address = models.OneToOneField(IPAddress, verbose_name="IP Address") port = models.CharField("Port", max_length=5) name = models.CharField("Game Name", max_length=100) ram = models.IntegerField("RAM (mb)", max_length=10) node = models.ForeignKey(node) user = models.ForeignKey(User) config = models.ForeignKey(Config) mysqlserver = models.ForeignKey(MySQLserver) mysqlenabled = models.BooleanField("MySQL Created?") suspended = models.BooleanField("Suspended") 

Y dentro de este modelo, tengo funciones como esta:

 def start(self): config = Config.objects.get(pk=self.config.id) cmds = config.startcmds game = config.gametype parsedcmds = self.replace_variables(cmds) client = phPanel.jelly.jelly.zmqclient(self.ip_address.address) data = {'user':self.generate_username(), 'method':'start_server', 'id':self.id, 'memory':self.ram, 'ip':self.ip_address.address, 'port':self.port, 'startcmds':parsedcmds, 'game':game} result = client.send(data) return result 

que me gustaría exponer a través de la API utilizando tastypie.

He revisado la documentación y el libro de cocina, pero parece que no puedo encontrar lo que estoy buscando.

Cualquier ayuda sería apreciada 🙂

Dentro de tu Juego-Recurso, siempre puedes anteponer nuevas URL que pueden exponer métodos. Por ejemplo (Editado según el comentario de @BigglesZX):

 from tastypie.resources import ModelResource from tastypie.utils import trailing_slash class GameResource(ModelResource): class Meta: queryset = Game.objects.all() resource_name = 'store' def prepend_urls(self): """ Add the following array of urls to the GameResource base urls """ return [ url(r"^(?P%s)/(?P\w[\w/-]*)/start%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('start'), name="api_game_start"), ] def start(self, request, **kwargs): """ proxy for the game.start method """ # you can do a method check to avoid bad requests self.method_check(request, allowed=['get']) # create a basic bundle object for self.get_cached_obj_get. basic_bundle = self.build_bundle(request=request) # using the primary key defined in the url, obtain the game game = self.cached_obj_get( bundle=basic_bundle, **self.remove_api_resource_names(kwargs)) # Return what the method output, tastypie will handle the serialization return self.create_response(request, game.start()) 

Así que ahora puedes llamar a este método usando el siguiente uri “/ game / [pk] / start /” So “/ game / 1 / start /” llamará el método de inicio de juego con pk = 1