Я новичок в DRF, так что это может быть простой вопрос ....
У меня есть вопрос относительно сериализации в DRF:
У меня есть следующие модели:
class Heading(models.Model):
name = models.CharField(max_length=20, db_index=True, unique=True, verbose_name='heading '
'title')
order = models.SmallIntegerField(default=0, db_index=True, verbose_name='Order')
foreignkey = models.ForeignKey("UpperHeading", on_delete=models.PROTECT, null=True,
blank=True, verbose_name="Upper heading", )
one_to_one_to_boat = models.OneToOneField(BoatModel, on_delete=models.SET_NULL, null=True,blank=True, verbose_name="correspondent boat for the category", )
change_date = models.DateTimeField(db_index=True, editable=False, auto_now=True)
# primary model
class UpperHeadingManager(models.Manager):
def get_queryset(self):
return models.Manager.get_queryset(self).filter(foreignkey__isnull=True)
class UpperHeading(Heading):
objects = UpperHeadingManager()
def __str__(self):
return self.name
class Meta:
proxy = True
ordering = ("order", "name")
verbose_name = "Upper heading"
verbose_name_plural = "Upper headings"
# secondary model
class SubHeadingManager(models.Manager):
def get_queryset(self):
return models.Manager.get_queryset(self).filter(foreignkey__isnull=False)
class SubHeading(Heading):
objects = SubHeadingManager()
def __str__(self):
return "%s - %s" % (self.foreignkey.name, self.name)
class Meta:
proxy = True
ordering = ("foreignkey__name", "name")
verbose_name = "Sub heading"
verbose_name_plural = "Sub headings"
Я хочу сделать сериализатор для модели Upperheading таким образом, чтобы он включал данные, относящиеся к SubHeading вторичной модели
Вот что я написал:
class UpperHeadingSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
name = serializers.CharField(max_length=20, required=True, allow_blank=False)
order = serializers.IntegerField()
subheading_set = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
def create(self, validated_data):
return UpperHeading.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.name = validated_data.get("name", "instance.name")
instance.order = validated_data.get("order", "instance.order")
instance.save()
return instance
class Meta:
model = UpperHeading
fields = ("id", "name", "order", "subheading_set")
Логически, если UpperHeading является основной моделью, а SubHeading является вторичной, обратный связанный менеджер должен быть по умолчанию «subheading_set». В моем serializers.py я указал это отношение в поле
subheading_set = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
но когда я пытаюсь использовать этот сериализатор, я получаю исключение:
AttributeError at /api/upperheadings/
'UpperHeading' object has no attribute 'subheading_set'
Вопрос в том, что мне тогда использовать в качестве отсталого менеджера в DRF? Эти 2 модели являются прокси-моделями, и у них нет связанного менеджера или он нестандартный.
a = UpperHeading.objects.first()
>>> a.subheading_set
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'UpperHeading' object has no attribute 'subheading_set'
Похоже, что в моделях прокси не поддерживается обратный связанный менеджер
В любом случае, есть ли шанс сериализовать отношения между двумя моделями?
Спасибо!