2013-05-02 6 views
5

Wie erhalten Sie das Modellobjekt einer tastypie modelresource von seiner URI?Get-Modell-Objekt von Tastypie Uri?

zum Beispiel:

, wenn Sie die uri als String in Python gegeben wurden, wie bekommt man das Modell Objekt dieser Zeichenfolge?

Antwort

1

Sind Sie auf der Suche nach flowchart? Es hängt wirklich von wenn Sie das Objekt wollen.

Innerhalb des Dehydratisierungszyklus können Sie einfach über Bündel zugreifen, z.

class MyResource(Resource): 
    # fields etc. 

    def dehydrate(self, bundle): 
     # Include the request IP in the bundle if the object has an attribute value 
     if bundle.obj.user: 
      bundle.data['request_ip'] = bundle.request.META.get('REMOTE_ADDR') 
     return bundle 

Wenn Sie ein Objekt durch eine api URL manuell abgerufen wird, ein Muster gegeben Sie einfach die Schnecke oder Primärschlüssel durchqueren könnten (oder was auch immer es ist) über das Standard-ORM-Schema?

2

Tastypie Resource-Klasse (die der Typ ModelResource ist Unterklassen) bietet eine Methode get_via_uri(uri, request). Seien Sie sich bewusst, dass seine Anrufe durch apply_authorization_limits(request, object_list) so, wenn Sie nicht das gewünschte Ergebnis erhalten, stellen Sie sicher, Ihre Anfrage so zu bearbeiten, dass es Ihre Genehmigung besteht.

Eine schlechte Alternative wäre die Verwendung eines Regex, um die ID aus Ihrer URL zu extrahieren und sie dann zu verwenden, um die Liste aller Objekte zu filtern. Das war mein schmutziger Hack, bis ich get_via_uri funktionierte und ich empfehle das NICHT. ;)

id_regex = re.compile("/(\d+)/$") 
object_id = id_regex.findall(your_url)[0] 
your_object = filter(lambda x: x.id == int(object_id),YourResource().get_object_list(request))[0] 
2

können Sie get_via_uri verwenden, aber als @Zakum erwähnt, dass eine Genehmigung gelten, die Sie wahrscheinlich nicht wollen. So in die Quelle zu graben für die Methode, die wir sehen, dass wir den URI wie diese lösen können:

from django.core.urlresolvers import resolve, get_script_prefix 

def get_pk_from_uri(uri): 
    prefix = get_script_prefix() 
    chomped_uri = uri 

    if prefix and chomped_uri.startswith(prefix): 
     chomped_uri = chomped_uri[len(prefix)-1:] 

    try: 
     view, args, kwargs = resolve(chomped_uri) 
    except Resolver404: 
     raise NotFound("The URL provided '%s' was not a link to a valid resource." % uri) 

    return kwargs['pk'] 

Wenn Ihre Django-Anwendung an der Wurzel des Webservers befindet (dh get_script_prefix() == '/'), dann können Sie diese vereinfachen bis auf:

view, args, kwargs = resolve(uri) 
pk = kwargs['pk']