Restanglar、Django REST和关系

Restanglar、Django REST和关系,django,angularjs,rest,django-rest-framework,restangular,Django,Angularjs,Rest,Django Rest Framework,Restangular,我使用Django REST框架对REST API进行建模,该API使用了很多模型关系 使用AngularJS和Restangular在前端级别解决这些关系的简单而好的方法是什么 模型 这就是我的部分模型的外观: class Country( Model ): name = CharField( max_length = 256 ) class City( Model ): name = CharField( max_length = 256 ) postal_code = Cha

我使用Django REST框架对REST API进行建模,该API使用了很多模型关系

使用AngularJS和Restangular在前端级别解决这些关系的简单而好的方法是什么

模型 这就是我的部分模型的外观:

class Country( Model ):
  name = CharField( max_length = 256 )

class City( Model ):
  name = CharField( max_length = 256 )
  postal_code = CharField( max_length = 16 )

  country = ForeignKey( "Country" )

class Customer( Model ):
  first_name = CharField( max_length = 256 )
  last_name = CharField( max_length = 256 )

  city = ForeignKey( "City" )
获取数据 下面的JavaScript代码显示了我如何加载数据:(我实际上使用了
all()
返回的承诺,但是
$object
较短,用于解释这一点)

这是一个城市响应的示例:(all,毫无例外,模型都包含一个id字段)

显示数据 最后是AngularJS部分,用于显示数据;您在这里看到的代码是我希望如何使用它:

<table>
  <tbody>
    <tr ng-repeat="customer in customers">
      <td>{{ customer.first_name }}</td>
      <td>{{ customer.last_name }}</td>
      <td>{{ cities[customer.city].name }}</td>
      <td>{{ countries[cities[customer.city].country].name }}</td>
    </tr>
  </tbody>
</table>

{{customer.first_name}
{{customer.last_name}
{{城市[customer.city].name}
{{国家[城市[customer.city].country].name}
诚然,嵌套语句看起来有点难看,但考虑到原始数据保持完整的事实,我同意这样做


不幸的是,代码(当然)不起作用。解决这种关系的好办法是什么?



提示:我愿意在任何涉及的框架/程序(Django、Django REST、AngularJS、Restangular等)中改变我的做事方式。

我认为最好的方法是创建嵌套的Serailizer。您必须在POST上关闭序列化程序,但在list上并检索类似于这样的序列化程序是可行的

class CountrySerializer(serializer.ModelSerializer):
    class Meta:
        model = Country


class CitySerializer(serializer.ModelSerializer):
    country = CountrySerializer()
    class Meta:
        model = City

class CustomerSerializer(serializer.ModelSerializer):
    city = CitySerializer()
    class Meta:
        model = Customer

class CustomerViewSet(viewsets.ModelViewSet):
    model = Customer
    serializer_class = CustomerSerializer
    queryset = Customer.objects.all()
然后,您的重新启动语言只需点击api,对象就可以正确嵌套

Restangular.all('costumers').one(1).get().then(function(response) {
    $scope.costumer = response; 
})

利用API响应制作模型。这样你就不必到处被dict访问弄脏手指了。@limelights你是说我应该解析API中的数据,将其打包成对象,并链接这些对象来表示关系?这会起作用,但它也会在客户端代码中添加大量冗余(模型已经在API提供程序中定义,数据已经在JS数组中结构化)。我整天都在写解析器+反序列化程序。:/(或者我不知道有没有什么好的JS库?)
class CountrySerializer(serializer.ModelSerializer):
    class Meta:
        model = Country


class CitySerializer(serializer.ModelSerializer):
    country = CountrySerializer()
    class Meta:
        model = City

class CustomerSerializer(serializer.ModelSerializer):
    city = CitySerializer()
    class Meta:
        model = Customer

class CustomerViewSet(viewsets.ModelViewSet):
    model = Customer
    serializer_class = CustomerSerializer
    queryset = Customer.objects.all()
Restangular.all('costumers').one(1).get().then(function(response) {
    $scope.costumer = response; 
})