добрый день такой вопрос есть модели с наследованием, как реализовать так чтобы в раздел блок выдавались модели в зависимости от назначения , поясню есть урок который состоит из блоков ( есть 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'.