首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何考虑Django的基于类的普通视图与使用REST

如何考虑Django的基于类的普通视图与使用REST
EN

Stack Overflow用户
提问于 2016-02-04 03:00:53
回答 2查看 872关注 0票数 2

我一直在与Django一起编写一个webapp,以取代我和一些朋友玩的笨拙的、基于电子表格的体育采摘游戏。我学到了很多,并且很高兴了解Django,以及如何从头开始构建这样的东西。

我最近意识到,我想使用更强大的东西在前端(Ember,角等),最终目标是一个单一的页面应用程序。为此,我安装了Django REST Framework (DRF),并开始阅读文档并遵循本教程。这非常有趣,我终于开始明白为什么一个带有API的客户机-服务器模型实际上是实现现在已经结束的平滑的交互性的唯一方法。

我正试图将一个基于类的视图实现为API端点,并且我在概念化它时遇到了很多困难。我想我应该从一个简单的、纯获取的端点开始--下面是我试图以API形式复制的简单CBV:

代码语言:javascript
复制
class MatchupDetail(DetailView):
  template_name = 'app/matchups.html'
  context_object_name = 'pick_sheet'

  def get_object(self):
    #logic to find and return object

  def get_opponent(self,username,schedule,week, **kwargs):
    #logic to find and return the opponent in the matchup

  def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    #logic to pull the opponents details and set them in the context

我觉得这个流有一个句柄--用户单击一个链接,这个视图检索请求页面中心的对象,在上下文中补充它,然后呈现它。

当我开始考虑把它变成一个API端点时,它并没有什么意义。我应该把所有与用户相关的数据放到一个JSON响应中吗?或者,前端应该基本上处理这个逻辑流,而API只是由一个端点集合组成--例如,一个用于检索对象,一个或多个用于检索上下文中现在传递的内容?

促使我写这篇文章的是上面视图的(超级基本的) API实现出现了一些问题:

代码语言:javascript
复制
class MatchupDetailApi(generics.ListAPIView):

  queryset = Sheet.objects.all()
  serializer_class = SheetSerializer

用串行化器:

代码语言:javascript
复制
class SheetSerializer(serializers.ModelSerializer):
  user = serializers.ReadOnlyField()

  class Meta:
    model = Sheet

当我注意到没有它时,我添加了user字段,返回的序列化工作表对象实际上只是数据库中的行--一个整数ID,指向用户对象的整数外键,等等。使用“传统”CBV,整个对象都返回到模板中--因此访问相关字段非常直观,使用Django也很容易遍历对象关系。

REST实现是否提供了相同的功能?据我所读,我似乎需要对DRF (django-rest-多模型)进行扩展,以便在一个响应中返回多个模型,这使我认为我应该为每个模型创建端点,并将表示逻辑留给处理前端的时候。这是典型的吗?还是可以让API端点返回类似对象和几个相关对象的内容?

注意事项:当我将用户添加到SheetSerializer时,上面的基本端点停止工作。我意识到我也应该有一个UserSerializer,即:

代码语言:javascript
复制
class UserSerializer(serializers.HyperlinkedModelSerializer):
  class Meta:
    model = User

但是,当我尝试浏览API时,我得到了第一个用户不可序列化的TypeError。具体来说:<User: dkhaupt> is not JSON serializable.这不是UserSerializer的作用吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-04 05:10:20

拥有一个返回类似对象和几个相关对象的API端点是否可行?

是!

听起来你有个很好的开始。我会把它构造成这样:

代码语言:javascript
复制
class UserSerializer(serializers.ModelSerializer):
    """serializes a user"""
    class Meta:
        model = User
        fields = ('id', 'first_name', 'last_name',)


class SheetSerializer(serializers.ModelSerializer):
    """serializes a sheet, and nests user relationship"""
    user = UserSerializer(read_only=True)

    class Meta:
        model = Sheet
        fields = ('id', 'sheet_name', 'user',)

我不认为你需要django-rest-多种模型来实现你想要的目标。在我的草图(我猜字段名)中,您将序列化工作表以及相关的用户对象。

票数 2
EN

Stack Overflow用户

发布于 2016-02-04 09:13:45

可以使用属性从另一个相关模型中添加字段。

例如:

代码语言:javascript
复制
class SheetSerializer(serializers.ModelSerializer):
  user_id = serializers.ReadOnlyField(source='user.user_id')
  username = serializers.ReadOnlyField(source='user.username')

  class Meta:
    model = Sheet

在这里,序列化程序将返回来自与工作表模型相关的用户模型的信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35191707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档