Restanglar、Django REST和关系
我使用Django REST框架对REST API进行建模,该API使用了很多模型关系 使用AngularJS和Restangular在前端级别解决这些关系的简单而好的方法是什么 模型 这就是我的部分模型的外观: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
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;
})