Sto tentando di implementare una risorsa nidificata in cui uno dei suoi campi dipende da un valore dalla sua risorsa padre.Framework Rango di Django: un oggetto nidificato può accedere ai dettagli dell'oggetto principale in una visualizzazione elenco?
Supponiamo di costruire un sistema per un'azienda che fornisce informazioni sui propri clienti e cifre di vendita per i venditori dell'azienda. Quindi abbiamo due modelli, Cliente e Rep. Un rappresentante può vendere a più di un cliente.
URL che restituisce tutti i clienti: /api/1.0/customers/
URL per un cliente specifico: /api/1.0/customers/123/
URL per informazioni specifiche del cliente per una specifica rappresentante: /api/1.0/customers/123/rep/9/
Nota l'URL rappresentante contiene il cliente ID e l'ID rappresentante.
Desidero che l'URL del cliente restituisca una risorsa nidificata contenente informazioni di riepilogo sul rappresentante, oltre a un collegamento ipertestuale a informazioni complete specifiche del cliente per tale rappresentante. Questa è l'uscita dal URL per tutti i clienti:
[
{
"id": 100,
"customer_name": "DolManSaxLil",
"rep": {
"id": 4,
"annual_sales": 1500.01,
"name": "Fred",
"url": "http://localhost:8000/api/1.0/customer/100/rep/4/"
}
},
{
"id": 200,
"customer_name": "Hotblack",
"rep": {
"id": 4,
"annual_sales": 10500.42,
"name": "Fred",
"url": "http://localhost:8000/api/1.0/customer/200/rep/4/"
}
}
]
Per attuare questo definiamo due serializzatori:
class CustomerSummarySerializer(serializers.HyperlinkedModelSerializer):
id = ...
name = ...
rep = RepSummarySerializer(read_only=True)
class RepSummarySerializer(serializers.HyperlinkedModelSerializer):
id = ...
annual_sales = ...
name = ....
url = serializers.SerializerMethodField('get_rep_url')
Il problema che sto affrontando è che non riesco a capire come accedere il cliente corrente .id dalla funzione RepSummarySerializer.get_rep_url
. E 'possibile in una vista di dettaglio come il cliente è tenuto in self.parent.obj
:
def get_rep_url(self, obj):
customer_id = self.parent.obj.id
url = reverse('api_customer_rep',
kwargs={'customer_id': customer_id,
'rep_id': obj.id},
request=serializer.context.get('request'))
return url
Tuttavia, in una vista elenco, self.parent.obj
è un QuerySet di oggetti del cliente e non riesco a vedere alcun modo di identificare il cliente corrente. C'è un modo per farlo? Ho perso qualcosa di ovvio?
Una soluzione elegante.E funziona perfettamente! Molte grazie! – gregoltsov
Ottima soluzione, ma ho dovuto cambiare rep = obj.rep in rep = obj.rep.get() –