2015-06-23 11 views
6

Per favore, sopportami. Sto solo imparando django-rest-framework. E davvero non riesco ad afferrarlo.Come lavorare con django-rest-framework nei modelli

modello:

class Day(models.Model): 
    date = models.DateField(default=date.today) 

class ToDo(models.Model): 
    date = models.ForeignKey(Day) 
    name = models.CharField(max_length=100) 
    very_important = models.BooleanField(default=False) 
    finished = models.BooleanField(default=False) 

visualizzazione normale:

def home(request): 
    days = Day.objects.all() 

    return render(request, 'test.html', { 
     'days':days 
    }) 

creato un file serializers.py:

class DaySerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Day 
     field = ('id', 'date') 


class ToDoSerializer(serializers.ModelSerializer): 
    date = DaySerializer() 
    class Meta: 
     model = ToDo 
     field = ('id', 'date', 'name', 'very_important', 'finished') 

Dopo questo mi sono perso. Supponiamo che vada a url('^api/$'), come ottengo gli oggetti JSON di Day e il relativo oggetto?

Fondamentalmente questo è come voglio essere visualizzato:

enter image description here

Ora come posso lavorare con Django-resto-quadro per assomigliare quanto sopra nel modello.

aggiornamento

mi piacerebbe fare qualcosa di simile:

  1. Ottenere gli oggetti JSON andando a un URL (ad esempio: /api/.json)

    [ 
        { 
         "id": 1, 
         "date": "2015-06-23", 
         "day_todo_set": [ 
          { 
           "id":5 
           "name": "Bloom", 
           "very_important": True, 
           "finished": False 
          }, 
          { 
           "id":4 
           "name": "REST", 
           "very_important": True, 
           "finished": True 
          } 
         ] 
        }, 
        { 
         "id": 2, 
         "date": "2015-06-22", 
         "day_todo_set": [ 
          { 
           "id":3 
           "name": "Alarm 1", 
           "very_important": True, 
           "finished": True 
          }, 
          { 
           "id":2 
           "name": "Meet up with SIS", 
           "very_important": True, 
           "finished": False 
          }, 
          { 
           "id":1 
           "name": "Buy Milk", 
           "very_important": True, 
           "finished": False 
          } 
         ] 
        } 
    ] 
    
  2. Manipolare gli oggetti

JS:

$(function() { 
    var $days = $('#days') 

    $.ajax({ 
     type: 'GET', 
     url: '/api/.json', 
     success: function(days) { 
      $.each(days, function(i, day) { 
       $days.append('<li>date: '+ day.date+ '</li>') 
      }); 
     } 
    }); 
}) 

risposta

7

model.py:

class Day(models.Model): 
    date = models.DateField(default=date.today) 

    def get_todo_list(self): 
     return self.day_todo_set.order_by('-id')[:5] 

class ToDo(models.Model): 
    date = models.ForeignKey(Day, related_name="day_todo_set") 
    name = models.CharField(max_length=100) 
    very_important = models.BooleanField(default=False) 
    finished = models.BooleanField(default=False) 

In serializers.py

class ToDoSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = ToDo 
     field = ('id', 'date', 'name', 'very_important', 'finished') 

class DaySerializer(serializers.ModelSerializer): 

    day_todo_set = ToDoSerializer(many=True, source="get_todo_list") 

    class Meta: 
     model = Day 
     field = ('id', 'date', 'day_todo_set') 

Scrivi una vista di Django usando il tuo serializzatore.

@csrf_exempt 
def day_list(request): 
    """ 
    List all code snippets, or create a new snippet. 
    """ 
    if request.method == 'GET': 
     snippets = Day.objects.order_by('-date')[:10] 
     serializer = DaySerializer(snippets, many=True) 
     return JSONResponse(serializer.data) 

Nella tua urls.py

url(r'^api/$', views.day_list, name='days_list') 
+0

Perché hai importato APIView? E sì, mi sta dando degli oggetti di giorni, ma ho anche bisogno di ogni giorno. Come lo faccio? Grazie. – Kakar

+0

Controllare il codice modificato –

+0

Sì. È come previsto! Grazie. Solo un'altra cosa, c'è comunque per ottenere solo oggetti da 10 giorni e 5 oggetti ToDo, probabilmente nelle viste? – Kakar

0

quadro riposo non ha lo scopo di servire l'HTML che viene visualizzato in un browser. Esso è rivolto a servire i dati a un altro servizio (un dispositivo mobile, un client pesante, un altro server, ecc)

Prima linea della documentation:

Django REST quadro è un toolkit potente e flessibile questo lo rende facile da costruire API Web.

Se si desidera visualizzare il risultato in un browser, uso di modelli e non usano resto

+0

sì, lo so.È quello che voglio. Supponiamo che lo voglio in formato json, e se vado a 'url ('^ api/$')', come ottenere l'elenco dei giorni e il relativo oggetto? – Kakar

+0

http://www.django-rest-framework.org/tutorial/2-requests-and-responses/ –

+0

Sì. Penso sia così. Per favore, guarda i miei aggiornamenti e guidami come. Grazie. – Kakar