2017-01-26 4 views
1

У меня есть следующие таблицы MySQL:
-Сделать
-модели
-stylesСоздание API с использованием Django-Rest-Framework с объединения таблиц

models.py (автогенерируемая)

class Makes(models.Model): 
    id = models.IntegerField(primary_key=True) 
    name = models.CharField(max_length=13) 
    nicename = models.CharField(db_column='niceName', max_length=13) 
    class Meta: 
     managed = False 
     db_table = 'Makes' 


class Models(models.Model): 
    id = models.CharField(primary_key=True, max_length=36) 
    name = models.CharField(max_length=23) 
    nicename = models.CharField(db_column='niceName', max_length=23) 
    make = models.ForeignKey(Makes, models.DO_NOTHING) 
    class Meta: 
     managed = False 
     db_table = 'Models' 

serializers.py

class MakeSerializer(serializers.ModelSerializer): 


    class Meta: 
    model = Makes 
    fields = ('name',) 


class ModelSerializer(serializers.ModelSerializer): 


make = MakeSerializer(many=True, read_only=True) 

class Meta: 
    model = Models 
    fields = ('make','id', 'name', 'nicename') 

views.py

class MakesList(generics.ListCreateAPIView): 
    queryset = Makes.objects.all() 
    serializer_class = MakeSerializer 

class MakesDetail(generics.RetrieveUpdateDestroyAPIView): 
    queryset = Makes.objects.all() 
    serializer_class = MakeSerializer 

Другими словами, Styles - это родительская таблица, содержащая идентификатор Make и Model, который соединяет эти два.

Как я могу идти о том, чтобы отношения с ФПИ, чтобы дать мне ожидаемый результат:

"makes": [{ 
    "id": 1, 
    "name": "Acura", 
    "models": [{ 
     "id": "Acura_ILX", 
     "name": "ILX", 
     "styles": [{ 
        "id": "1" 
        "name": "Sport" 
        }] 
    }, { 
     "id": "Acura_ILX_Hybrid", 
     "name": "ILX Hybrid", 
     "styles": [{ 
        "id": "1" 
        "name": "Sport" 
        }] 
    }, { 
     "id": "Acura_MDX", 
     "name": "MDX", 
     "styles": [{ 
        "id": "1" 
        "name": "Sport" 
        }] 
     }] 

ответ

2

Поэтому в основном то, что вам нужно сделать, это создать кучу сериализаторов.

class MakeSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Make 
     fields = ('your', 'fields', 'here') 

class ModelSerializer(serializers.ModelSerializer): 
    make = MakeSerializer(many=True, read_only=True) 

    class Meta: 
     model = Model 
     fields = ('name', 'just_fields_here') 

class StyleSerializer(serializers.ModelSerializer): 
    model = ModelSerializer(many=True, read_only=True) 

    class Meta: 
     model = Style 
     fields = ('your_fields_here_again',) 

Вот как ваши сериализаторы могли бы выглядеть в простом виде.

И это, как вы могли бы использовать:

>>> make = Make.objects.create(name="Audi") 
>>> model1 = Model.objects.create(make=make, name='R8') 
>>> model2 = Model.objects.create(make=make, name='Q7') 
>>> Style.objects.create(model=model1, name='Sport') 
>>> Style.objects.create(model=model2, name='SUV') 

>>> serializer = MakeSerializer(instance=make) 

и с помощью

>>> serializer.data 

вам выход должен выглядеть следующим образом:

{ 
    'name': 'Audi', 
    'model': [{ 
     'name': 'R8', 
     'style': { 
      'name': 'Sport' 
     } 
    },{ 
     'name': 'Q7', 
     'style': { 
      'name': 'SUV' 
     } 
    }] 
} 
+0

Это просто пример. Если у вас есть данные, просто создайте эти сериализаторы. Загрузите один объект, который вас интересует, и передайте его в сериализатор как пример – sebb

+0

это хорошо? это то, что вы ожидали? – sebb

+0

Я только что редактировал свой пост, чтобы вы могли видеть мои настройки. – Moshe