Проблемы с сериализатором для прокси моделей DRF / DJANGO - PullRequest
0 голосов
/ 08 июля 2019

Я новичок в 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'

Похоже, что в моделях прокси не поддерживается обратный связанный менеджер

В любом случае, есть ли шанс сериализовать отношения между двумя моделями?

Спасибо!

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