2015-06-23 10 views
6

Proszę o zachowanie mnie. Właśnie się uczę django-rest-framework. I naprawdę nie mogę tego złapać.Jak pracować z django-rest-framework w szablonach

model:

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) 

normalny widok:

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

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

Utworzony plik 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') 

Po to jestem zgubiony. Załóżmy, że idę do url('^api/$'), w jaki sposób uzyskać obiektów json Day i związanych z nim obiektu?

Zasadniczo jest to w jaki sposób mają być wyświetlane:

enter image description here

Teraz jak mogę pracować z django-Rest-ram wyglądać jak wyżej w szablonie.

aktualizacja

chciałbym zrobić coś takiego:

  1. uzyskać obiektów json przechodząc do adresu URL (np /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. Manipuluj obiektami

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>') 
      }); 
     } 
    }); 
}) 

Odpowiedz

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) 

W 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') 

Napisz widok django za pomocą serializera.

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

W swojej urls.py

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

Dlaczego zaimportowałeś APIView? I tak, to daje mi obiekty dni, ale potrzebuję też każdego dnia. Jak mogę to zrobić? Dziękuję Ci. – Kakar

+0

Sprawdź edytowany kod –

+0

Tak. Jest to zgodne z oczekiwaniami! Dziękuję Ci. Jeszcze jedno, czy jest tak czy inaczej, aby uzyskać tylko 10 obiektów Day i 5 obiektów ToDo, prawdopodobnie w widokach? – Kakar

0

reszta ramowa nie ma na celu służyć html, który jest wyświetlany w przeglądarce. Jego celem jest dostarczanie danych do innej usługi (urządzenie mobilne, ciężkiego Klienta, inny serwer, itp)

pierwszej linii documentation:

Django REST ramy jest mocny i elastyczny zestaw narzędzi dzięki temu łatwiej jest budować Web API.

Jeśli chcesz wyświetlić wynik w przeglądarce, używać szablonów i nie używać odpoczynek

+0

Tak, wiem.To jest to czego chce. Załóżmy, że chcę go w formacie json i jeśli przejdę do 'url ('^ api/$')', jak uzyskać listę dni i powiązanych obiektów? – Kakar

+0

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

+0

Tak. Myślę, że to wszystko. Czy możesz popatrzeć na moje aktualizacje i poprowadzić mnie, jak to zrobić. Dziękuję Ci. – Kakar