2012-12-29 17 views
11

Attualmente sto lavorando per implementare un'API nel mio progetto Django e Tastypie mi è sembrato più adatto.Esporre il metodo del modello con Tastypie

Quello che non riesco a capire è come esporre una funzione all'interno del mio modello usando Tastypie.

Ad esempio, ho questo modello:

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") 

E all'interno di questo modello, che hanno funzioni come questa:

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 

che desidero esporre attraverso l'API utilizzando tastypie.

Ho esaminato la documentazione e il ricettario ma non riesco a trovare quello che sto cercando.

Qualsiasi aiuto sarebbe apprezzato :)

+2

Probabilmente vorrai dare un'occhiata a: https://github.com/gati/tastypie-model-method –

risposta

20

All'interno del vostro gioco-Resource, si può sempre anteporre nuovi URL che possono esporre i metodi. Per esempio (A cura secondo il commento di @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<resource_name>%s)/(?P<pk>\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()) 

Così ora è possibile chiamare questo metodo utilizzando i seguenti URI "/ gioco/[PK]/start /" So "/ gioco/1/start/"chiamerà il metodo di inizio del gioco con pk = 1

+1

La firma per la funzione' cached_obj_get' è cambiato come da questa risposta: http://stackoverflow.com/a/15159600/258794 – BigglesZX

+0

Hai ragione @BigglesZX Ho aggiornato la mia risposta per riflettere l'ultima versione di tastypie. –

+0

come faresti con tastypie 0.9.11? Non trovo alcuna funzione prepend_urls in questa versione:/ – aRkadeFR

Problemi correlati