【问题标题】:How to work with django-rest-framework in the templates如何在模板中使用 django-rest-framework
【发布时间】:2015-09-08 22:48:24
【问题描述】:

请多多包涵。我只是在学习django-rest-framework。而且我好像真的抓不住。

型号:

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)

普通视图:

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

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

创建了一个 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')

在这之后我迷路了。假设我去url('^api/$'),如何获取Day及其相关对象的json对象?

基本上这就是我想要的显示方式:

现在我如何使用 django-rest-framework 在模板中看起来像上面那样。

更新

我想做这样的事情:

  1. 通过访问 url 获取 json 对象(例如:/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. 操作对象

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

【问题讨论】:

    标签: json django django-templates django-rest-framework


    【解决方案1】:

    模型.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)
    

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

    使用您的序列化程序编写一个 django 视图。

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

    在你的 urls.py 中

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

    【讨论】:

    • 为什么要导入APIView?是的,它给了我每天的对象,但我也需要每天的待办事项。我怎么做?谢谢。
    • 是的。正如预期的那样!谢谢你。还有一件事,有没有可能只获得 10 个 Day 对象和 5 个 ToDo 对象,可能在视图中?
    • snippets = Day.objects.order_by('-date')[:10] 将返回过去 10 天的对象。如果您想要最后 5 个任务,您可以在 return self. days_list.order_by('-id')[:5] 的 Day 模型上编写自定义方法,并使用 day_todo_set = ToDoSerializer(many=True, source="methed_name") 更新您的序列化程序
    • 请您用您的评论更新答案,这对其他用户也有帮助。再次感谢。
    • 更新了,可以试试了。
    【解决方案2】:

    rest 框架的目的不是为浏览器中显示的 html 提供服务。它旨在为其他服务(移动设备、重型客户端、其他服务器等)提供数据。

    documentation 的第一行:

    Django REST 框架是一个强大而灵活的工具包,它使得它 易于构建 Web API。

    如果你想在浏览器中显示结果,使用模板,不要使用rest

    【讨论】:

    • 是的,我知道。这就是我想要的。假设我想要json格式,如果我去url('^api/$'),我如何获取Days及其相关对象的列表?
    • 是的。我想就是这样。请您查看我的更新并指导我如何操作。谢谢。
    • 两者都没有理由不可用。拥有一个通过 json 接受/向其他来源/消费者提供数据的浏览器解决方案有很多用例。这不是一个或多个场景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2020-06-27
    • 2015-05-23
    • 1970-01-01
    • 2015-06-27
    • 2013-07-07
    • 2020-10-07
    相关资源
    最近更新 更多