Как получить и отобразить все дочерние объекты в родительском сериализаторе в DRF - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть 3 разных сериализатора для 3 разных представлений как родительского, так и дочернего объекта.Представления: CreateAPIView, ListAPIView, RetrieveAPIView.Таким образом, мой CreateAPIView имеет один сериализатор для создания объекта, ListAPIView имеет один сериализатор для перечисления объектов, а RetrieveAPIView имеет один для отображения деталей объекта.И это верно как для дочернего, так и для родительского объекта.Как мне перечислить все дочерние объекты в родительском объекте, которые связаны с ним?Это означает, что в RetrieveAPIView родительского элемента я хочу показать ListAPIView его дочерних элементов.

модели:

Доски классов (models.Model):

user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
name = models.CharField(max_length=50, blank=False, null=False, unique=True)
slug = models.SlugField()

def __str__(self):
    return self.name

def save(self, *args, **kwargs):
    self.slug = slugify(self.name)
    super(Boards, self).save(*args, **kwargs)

Списки классов (моделей).Модель):

name = models.CharField(max_length=50, blank=False, null=False, unique=True)
slug = models.SlugField()
board = models.ForeignKey(Boards, on_delete=models.CASCADE)

def __str__(self):
    return self.name

def save(self, *args, **kwargs):
    self.slug = slugify(self.name)
    super(Lists, self).save(*args, **kwargs)

и сериализаторы: класс BoardCreateSerializer (ModelSerializer):

# user = request.user
class Meta:
    model = Boards
    fields = ['name']

класс BoardListSerializer (ModelSerializer):

url = HyperlinkedIdentityField(
    view_name = 'trello:board-detail',
    lookup_field = 'slug',
)
user = SerializerMethodField()

class Meta:
    model = Boards
    fields = ['url', 'name', 'user']

def get_user(self, obj):
    return str(obj.user.username)

класс BoardDetailSerializer (ModelSerializer)):

user = SerializerMethodField()

class Meta:
    model = Boards
    fields = ['id', 'name', 'user']

def get_user(self, obj):
    return str(obj.user.username)

И аналогично, у меня также есть сериализаторы для списков (board-parent object, lists-children).Как показать все списки в подробном представлении связанных с ним советов?

1 Ответ

0 голосов
/ 07 декабря 2018

Есть несколько способов сделать это:

  1. Используйте аргумент source, добавив это поле в BoardDetailSerializer:

    class BoardDetailSerializer(ModelSerializer):
        user = SerializerMethodField()
        lists = ListSerializer(
            source='Lists_set',
            many=True
        )
        class Meta:
            model = Boards
            fields = ['id', 'name', 'user', 'lists']
    
        def get_user(self, obj):
            return str(obj.user.username)
    
  2. Вы также можете использовать SerializerMethodField() так же, как и для пользователя.В этом методе вам нужно пропустить список через сериализатор и получить данные в формате json (при условии, что вы используете рендерер json по умолчанию)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...