【问题标题】:How to get data from related tables like in django rest framework browsable API如何从相关表中获取数据,例如 django rest framework browsable API
【发布时间】:2015-02-14 13:43:40
【问题描述】:

我需要通过 Angularjs 填充一个表单,该表单应该从 API 获取数据。 API 应返回用户表中的数据以及通过外键与用户表相关的静态表(计划、国家/地区)中的数据。

序列化器:

class CountrySerializer(serializers.ModelSerializer):
    class Meta:
       model = Country
       queryset = Country.objects.all()
       fields = ('id','name')   

class PlanSerializer(serializers.ModelSerializer):
    class Meta:
       model = Plan
       queryset = Plan.objects.all()
       fields = ('id','details')

class UserSerializer(serializers.ModelSerializer):
    plan = PlanSerializer()
    conutry = CountrySerializer()
    class Meta:
        model = User
        fields = ('name','plan','role','country',)

我的用户模型:

class User(models.Model):
   name = models.CharField(max_length = 60)
   role = models.ForeignKey(User_Role, null = True, blank = True)
   plan = models.ForeignKey(Plan, null = True, blank = True)
   country = models.ForeignKey(Country, null = True, blank = True)

我将从 Angularjs 调用 UserSerializer API,它应该从相应的表中返回用户的姓名、计划、角色、国家以及其他计划的列表、国家/地区。

基本上我需要为用户更新计划、国家/地区,因此我需要从计划/国家表中获取其他计划/国家/地区详细信息,以便我可以发送 PUT/PATCH 请求来更新它。它与 Django rest 框架可浏览 API HTML 表单(用于 PUT)非常相似,只是我使用 Angularjs 从服务器获取数据。

我想要的只是一个 API,它为相应的用户挑选数据,该用户还从其他静态表(计划、国家表)中获取额外数据,这些数据有助于更新某些字段(如计划、国家)。

【问题讨论】:

  • 您能否更准确地描述问题所在?即您从 API 中得到的究竟是什么与您的期望。
  • @ThomasOrozco Iam 有一个 API,在加载页面时将获取用户(比如 user1)的详细信息,例如他的姓名、计划、国家等。计划和国家/地区是用户表的外键来自计划和国家表。我希望 api 返回与 user1 对应的行,并且它还应该从 Plan 和 Country 表中选择所有数据并将它们一起发送。
  • 现在得到的是 json {'name':'xxx','plan':{'id':1,'desc':'test1'},'country':{'id ':1,'name':'USA'}} 我需要的是 {'name':'xxx','plan':{'id':1,'desc':'test1'},'country': {'id':1,'name':'USA'}} + {'plan':[{'id':1,'desc':'test1'},{'id':2,'desc': 'test2'},{'id':3,'desc':'test4'}],'country':[{'id':1,'name':'USA'},{'id':2, 'name':'UK'},{'id':3,'name':'FRANCE'}]}

标签: django angularjs django-rest-framework


【解决方案1】:

您在此处尝试实现的目标(在同一响应中返回不同类型的对象)不太符合 REST 的想法,因此“django-rest-framework”不太可能让您这样做。

您可能应该在这里进行 3 次 API 调用:

  • 1 获取用户
  • 1 获取国家列表
  • 1 获取计划列表

【讨论】:

  • 谢谢Thomas,是否建议只加载一个表单就获取n-api调用?我有 10 个静态表,单个表单需要所有这些数据。您是否建议我编写 10+1 api 调用以从服务器获取所有静态数据和用户相关数据。 PS我通过angularJS进行所有API调用
  • @mithu 这样做是更简单的方法;从这个开始,对性能进行基准测试,然后优化你已经确定这是否是一个瓶颈。请记住,JavaScript 将并行发出请求(尽管肯定会有一些开销,因为必须建立多个连接,并且因为您不能对单个服务器有无限数量的请求)。考虑使用缓存来减少这些请求的频率。
  • 谢谢你会这样做的。
  • 应该在一个api调用中实现。
【解决方案2】:

你说得对,让 n-api 调用它不是最好的主意。 你可以使用Django REST framework nested serialization

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('name','plan','role','country',)
        depth = 1

【讨论】:

    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 2016-12-18
    • 1970-01-01
    相关资源
    最近更新 更多