sergey_1990
@sergey_1990
1

Как сериализовать наследуемые модели?

добрый день такой вопрос есть модели с наследованием, как реализовать так чтобы в раздел блок выдавались модели в зависимости от назначения , поясню есть урок который состоит из блоков ( есть 3 вида: информационный, выбор и вопрос), блоки имеют часть одинаковых полей и часть уникальных, поэтому принято решение наследования ( не использовал абстрактную модель т.к. есть fk на файлы для каждого блока), всё работает но вопрос дошел до сериализации и ТУПИК,
class Block(models.Model):
    BLOCK_TYPES = (
        ('info', 'Информация'),
        ('condition', 'Условие'),
        ('quiz', 'Опрос'),
    )
    title = models.CharField(max_length=150, verbose_name='Наименование блока')
    description = models.TextField(verbose_name='Текстовое поле блока')
    isStarted = models.BooleanField(default=False, verbose_name='Статус')
    type = models.CharField(
        max_length=20, choices=BLOCK_TYPES, default='info', verbose_name='Тип блока')
    lesson = models.ForeignKey(
        Lesson,  on_delete=models.CASCADE, related_name='blocks')

    timeMin = models.PositiveIntegerField(
        blank=True, verbose_name='Время прохождения блока MIN')
    timeMan = models.PositiveIntegerField(
        blank=True, verbose_name='Время прохождения блока MAX')


    def __str__(self):
        return self.title



class InfoBlock(Block):
    """информационный блок"""
    sortId = models.PositiveSmallIntegerField(
        default=1, verbose_name="Id сортировочный")
    transition = models.OneToOneField(Block, null=True, blank=True,  on_delete=models.CASCADE, related_name='infoBlocks',
                                      verbose_name="Блок на который осужествляется переход")

    class Meta:
        verbose_name = "Информационный блок"
        verbose_name_plural = "Информационные блоки"


class СonditionBlock(Block):
    """Блок условие"""
    sortId = models.PositiveSmallIntegerField(
        default=2, verbose_name="Id сортировочный")
    question = models.CharField(max_length=150, verbose_name='Куда дальше?')

    class Meta:
        verbose_name = "Блок условие"
        verbose_name_plural = "Блоки условие"

    def __str__(self):
        return self.question


class СonditionBlockAnswer(models.Model):
    """"Ответы для блока условие"""
    block = models.ForeignKey(
        СonditionBlock, on_delete=models.CASCADE, related_name='conditionBlockAnswers')
    label = models.CharField(max_length=150, verbose_name='Ответ')
    transition = models.ForeignKey(Block,  on_delete=models.CASCADE, related_name='conditionBlocktransition',
                                      verbose_name="Блок на который осужествляется переход")

    class Meta:
        verbose_name = "Ответ к блоку условие"
        verbose_name_plural = "Ответы к блоку условие"

пример на следования,
class BlockSerializer(serializers.ModelSerializer):

  class Meta:
    model = Block
    fields = '__all__'


class LessonSerializer(serializers.ModelSerializer):
    blocks = BlockSerializer(many=True, read_only=True)
    class Meta:
        model= Lesson
        fields = '__all__'


как мне в сериализаторе получить поля не только block а именно расширенной модели если даю:
class LessonSerializer(serializers.ModelSerializer):
    blocks = СonditionBlockSerializer(many=True, read_only=True)
    class Meta:
        model= Lesson
        fields = '__all__'

ругается на связь
The serializer field might be named incorrectly and not match any attribute or key on the `Block` instance.
Original exception text was: 'Block' object has no attribute 'question'.
  • Вопрос задан
  • 56 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы