Pregunta

Estoy usando Django REST Framework para modelar una API REST que usa muchas relaciones de modelo.

¿Cuál es una manera fácil y buena de resolver esas relaciones a nivel de frontend usando AngularJS y Restangular?

Modelos

Así lucen parte de mis modelos:

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" )

Obteniendo los datos

El siguiente código JavaScript muestra cómo cargo los datos:(De hecho, uso las promesas devueltas por all(), pero $object es más corto para explicar esto)

$scope.countries = [];
$scope.cities = [];
$scope.customers = [];

Restangular.all( "countries" ).getList().$object;
Restangular.all( "cities" ).getList().$object;
Restangular.all( "customers" ).getList().$object;

He aquí un ejemplo de un ciudades respuesta:(todo, sin excepción, los modelos contienen un identificación campo)

[{"id": 1, "name": "Bocholt", "postal_code": "46397", "country": 1}]

Mostrando los datos

Y finalmente la parte de AngularJS para mostrar los datos;El código que ves aquí es cómo me gustaría usarlo:

<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>

Es cierto que la declaración anidada parece un poco fea, pero considerando el hecho de que los datos originales permanecen intactos, no tengo problema en hacerlo así.


Lamentablemente, el código (por supuesto) no funciona.¿Cuál es una buena manera de resolver este tipo de relaciones?


Clave:Estoy dispuesto a cambiar mi forma de hacer las cosas en cualquiera de los marcos/programas involucrados (Django, Django REST, AngularJS, Restangular, etc.).

¿Fue útil?

Solución

Creo que la mejor manera de hacer esto es crear los ealailizadores anidados.Tendrá que cambiar el Serializador en publicaciones, pero en la lista y recuperará un serializador como este funcionaría.

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()

y luego su Restangular solo tiene que presionar la API y el objeto está correctamente anidado

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top