我一直在与Django一起编写一个webapp,以取代我和一些朋友玩的笨拙的、基于电子表格的体育采摘游戏。我学到了很多,并且很高兴了解Django,以及如何从头开始构建这样的东西。
我最近意识到,我想使用更强大的东西在前端(Ember,角等),最终目标是一个单一的页面应用程序。为此,我安装了Django REST Framework (DRF),并开始阅读文档并遵循本教程。这非常有趣,我终于开始明白为什么一个带有API的客户机-服务器模型实际上是实现现在已经结束的平滑的交互性的唯一方法。
我正试图将一个基于类的视图实现为API端点,并且我在概念化它时遇到了很多困难。我想我应该从一个简单的、纯获取的端点开始--下面是我试图以API形式复制的简单CBV:
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实现出现了一些问题:
class MatchupDetailApi(generics.ListAPIView):
queryset = Sheet.objects.all()
serializer_class = SheetSerializer用串行化器:
class SheetSerializer(serializers.ModelSerializer):
user = serializers.ReadOnlyField()
class Meta:
model = Sheet当我注意到没有它时,我添加了user字段,返回的序列化工作表对象实际上只是数据库中的行--一个整数ID,指向用户对象的整数外键,等等。使用“传统”CBV,整个对象都返回到模板中--因此访问相关字段非常直观,使用Django也很容易遍历对象关系。
REST实现是否提供了相同的功能?据我所读,我似乎需要对DRF (django-rest-多模型)进行扩展,以便在一个响应中返回多个模型,这使我认为我应该为每个模型创建端点,并将表示逻辑留给处理前端的时候。这是典型的吗?还是可以让API端点返回类似对象和几个相关对象的内容?
注意事项:当我将用户添加到SheetSerializer时,上面的基本端点停止工作。我意识到我也应该有一个UserSerializer,即:
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User但是,当我尝试浏览API时,我得到了第一个用户不可序列化的TypeError。具体来说:<User: dkhaupt> is not JSON serializable.这不是UserSerializer的作用吗?
发布于 2016-02-04 05:10:20
拥有一个返回类似对象和几个相关对象的API端点是否可行?
是!
听起来你有个很好的开始。我会把它构造成这样:
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-多种模型来实现你想要的目标。在我的草图(我猜字段名)中,您将序列化工作表以及相关的用户对象。
发布于 2016-02-04 09:13:45
可以使用源属性从另一个相关模型中添加字段。
例如:
class SheetSerializer(serializers.ModelSerializer):
user_id = serializers.ReadOnlyField(source='user.user_id')
username = serializers.ReadOnlyField(source='user.username')
class Meta:
model = Sheet在这里,序列化程序将返回来自与工作表模型相关的用户模型的信息。
https://stackoverflow.com/questions/35191707
复制相似问题