Жизнь нам порой дает удивительные сюрпризы, порой мы думаем работать с одним, а начинаем совсем с другим. Так появилось мое знакомство с Python. Это совсем другой мир. Знакомство произошло сразу с Django REST Framework 3.

Один из вопросов, с которым приходилось сталкиваться это связь между таблицами.

Долгий поиск ответов в интернете четких ответов не дал, а лишь вернул к ticket’ам.

Предлагались различные решения: использование апи самих моделей, написание собственных серилизаторов (но это требовало значительных изменений в моделях), использование различных серилизаторов для записи и для чтения и так далее.

Наш вариант основан на различных полях для записи и для чтения.

Создаем модели:

class Category(models.Model):
   title = models.CharField(verbose_name='title', max_length=250)

class Course(models.Model):
   # category_id = models.ForeignKey(Category, verbose_name='Category')
   category_id = models.ManyToManyField(Category, verbose_name="Category")
   title = models.CharField(verbose_name='title', max_length=250)

Комментарием, обозначено то, что данный способ работает и для связей один к многим и многие к многим.

 

Опишем серилизаторы:

class CategorySerializer(serializers.ModelSerializer):
   class Meta:
       model = Category
       fields = ('id', 'title')

class CourseSerializer(serializers.ModelSerializer):
   category = CategorySerializer(many=True, read_only=True, source='category_id')

   class Meta:
       model = Course
       fields = ('id', 'title', 'category_id', 'category')
       extra_kwargs = {
           'category_id': {
               'write_only': True,
           },
       }

Данный пример выведет информацию в дочернем элементе, о родительском. 

Теперь приведем пример, как вывести в родительском объекте, информацию о дочерних.

Вновь начинаем с моделей. Здесь, главное указать related_name :

class Category(models.Model):
    title = models.CharField(verbose_name='title', max_length=250)

class Course(models.Model):
    category_id = models.ManyToManyField(Category, verbose_name="Category", blank=True, related_name='courses')
    title = models.CharField(verbose_name='title', max_length=250

Опишем серилизатторы, в них главное правильно написать последовательность

from rest_framework import serializers


class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course
        fields = ('id', 'title')

class CategorySerializer(serializers.ModelSerializer):
    courses = CourseSerializer(many=True, read_only=True)
    class Meta:
        model = Category
        fields = ('id', 'title', 'courses')

И все, теперь для записи, просто передаем  ид, и для чтения получаем целиком объект. Так, же хотелось, об ответить, что есть существенное отличие при передаче данных формы от PHP.

В ПХП, для передачи массива, мы именуем элемент, как массив (input[]), в django элементы передаются изначально, как члены списка.

 


Комментарии

Комментарии отсутствуют
У Вас есть вопросы?
Давайте обсудим их! Продумаем! Сделаем!
Напишите прямо сейчас!

Новый комментарий

Имя:
:

Смотрите также:

Нет изображения

Инициализация данных ModelViewSet в Django REST Framework

Задаем значения параметров вьюшки по умолчанию
Нет изображения

Django Rest Framework, пишем связи

Создаем правильное JSON дерево
Нет изображения

DRF. Вложенные шаблонизаторы с возможностью записи

Изобретаем велосипед в django rest framework. Записываем вложенные объеккты
Первый контакт с нами