2012-11-09 11 views
7

Nel mio modello Django, ho 10 campi e ci sono 3 campi che sono chiavi esterne. Nei miei dati JSON ricevuti da una richiesta GET, ottengo tutti i campi ma non le chiavi esterne.Come caricare gli elementi di chiavi esterne in Tastypie

Ho anche fatto questo, ma io non sono ancora ottenere quei campi nei dati JSON:

DataFields = MyData._meta.get_all_field_names() 
class MyResource(ModelResource): 
     class Meta: 
     queryset = MyData.objects.all() 
     resource_name = 'Myres' 
     serializer = Serializer(formats=['json']) 
     filtering = dict(zip(DataFields, [ALL_WITH_RELATIONS for f in DataFields])) 

Ad esempio, ho il campo nel modello come city, ma quel campo non è disponibile in JSON Ne vado.

C'è un modo in cui in JSON posso ottenere automaticamente city:city__name?

Se faccio questo, allora ottengo la città, ma posso farlo senza definire:

def dehydrate(self, bundle): 
     bundle.data["city_name"] = bundle.obj.city__name 
     return bundle 

risposta

11

Ti consigliamo di creare related resources per i vostri campi chiave stranieri e li incorpora in MyResource. Se si crea la risorsa incorporata full=True, verrà disidratata quando si preleva lo MyResource, altrimenti verrà incorporata come uri della risorsa correlata.

class RelatedResource(ModelResource): 
    class Meta: 
     ... 


class MyResource(ModelResource): 
    related = fields.ForeignKey(RelatedResource, full=True) 

    class Meta: 
     ... 

È quindi possibile filtrare per ?related__field=value nella richiesta GET a MyResource.


Se stai solo volere il campo restituito dal modello del __unicode__, si può provare a fare quanto segue (anziché incorporare una risorsa correlata):

class MyResource(ModelResource):  
    city = fields.CharField(attribute="city") 

    class Meta: 
     ... 

Dove "città" è il campo nome della chiave esterna nel modello MyData.

+0

C'è un modo per farlo senza definire alcuna risorsa. Altrimenti ho dovuto fare la risorsa di ogni mio modello in djnago. non è lo spreco di tempo – user825904

+0

Fare risorse aggiuntive sarà la soluzione migliore. Puoi creare risorse minime, tenerle lontane dall'API (non aggiungerle ai tuoi URL) e incorporarle con 'full = True'. Non sarà molto lavoro extra. Altrimenti, il metodo di disidratazione è l'alternativa. – Blake

Problemi correlati