Django Rest Framework Вложенные сериализаторы - PullRequest
0 голосов
/ 05 июля 2018

В настоящее время у меня возникают проблемы с выполнением двухслойного вложения с Django rest framework. Я прочитал документы DRF с вложенными отношениями здесь http://www.django -rest-framework.org / api-guide / Relations / и успешно прошел первый слой, который должен отображать стили с несколькими цветами в JSON. Не уверен, как связать другой слой, хотя. Любая помощь будет оценена. Заранее спасибо!

Токовый выход выглядит так:

[{
    "name": "AAA123",
    "colors": [
        {
            "name": "White"
        }
    ]
},
{
    "name": "BBB222",
    "colors": [
        {
            "name": "White"
        },
        {
            "name": "Pink"
        },
        {
            "name": "Blue"
        }
    ]
}]

Требуемый вывод должен быть таким:

[{
    "name": "AAA123",
    "colors": [
        {
            "name": "White",
            "sizes": [{name: "S"}, {name: "M"}]
        }
    ]
},
{
    "name": "BBB222",
    "colors": [
        {
            "name": "White",
            "sizes": [{name: "XS"}, {name: "S"}]
        },
        {
            "name": "Pink"
            "sizes": [{name: "XL"}, {name: "XXL"}]
        },
        {
            "name": "Blue"
            "sizes": [{name: "L"}, {name: "XL"}]
        }
    ]
}]

В частности, я хотел бы показать, что каждому стилю присваивается набор цветов, а каждой комбинации стиля и цвета присваивается набор размеров.

Ниже приведены мои текущие serializers.py и models.py. Я использовал промежуточную таблицу, потому что я планирую добавить дополнительные сложности в будущем (например, в style-color я хотел бы прикрепить расположение цветной картинки и в стиле -размер, приложу замеры)

serializers.py

class ColorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Color
        fields = ['name']


class SizeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Size
        fields = ['name']


class StyleSerializer(serializers.ModelSerializer):
    colors = ColorSerializer(many=True, read_only=True)

    class Meta:
        model = Style
        fields = ['name', 'colors']

models.py

class Style(models.Model):
    name = models.CharField(max_length=36, unique=True)
    colors = models.ManyToManyField('Color', through='StyleColor')



class Color(models.Model):
    name = models.CharField(max_length=36, unique=True)



class Size(models.Model):
    name = models.CharField(max_length=12, unique=True)



class StyleColor(models.Model):
    style = models.ForeignKey('Style', on_delete=models.CASCADE)
    color = models.ForeignKey('Color', on_delete=models.CASCADE)
    sizes = models.ManyToManyField('Size', through='StyleColorSize')

    class Meta:
        unique_together = ('style', 'color')



class StyleColorSize(models.Model):
    style_color = models.ForeignKey('StyleColor', on_delete=models.CASCADE)
    size = models.ForeignKey('Size', on_delete=models.CASCADE)

    class Meta:
        unique_together = ('style_color', 'size')

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

serializers.py

class ColorSerializer(serializers.ModelSerializer):

    class Meta:
        model = Color
        fields = '__all__'

class StyleSerializer(serializers.ModelSerializer):
    color = ColorSerializer() # each style has a set of colors attributed to it

    class Meta:
        model = Style
        fields = '__all__'

class SizeSerializer(serializers.ModelSerializer):

    class Meta:
        model = Size
        fields = '__all__'

class StyleColorSerializer(serializers.ModelSerializer):
    size = SizeSerializer() # each style-color combination has a set of sizes attributed to it

    class Meta:
        model = StyleColor
        fields = '__all__'

Поскольку ваши модели слишком сложны, боюсь, приведенный выше код не очень хорошо подошел.

Чтобы быть более общим, если вы хотите присоединить набор запросов модели B в то же время, когда вы выбираете набор запросов модели A (которая имеет отношение к модели B), вы должны определить BSerializer () в классе ASerializer ().

0 голосов
/ 06 июля 2018

Спасибо всем, кто пытался ответить. Получил вдохновение от ответа по этой ссылке на тот случай, если у кого-то возникнут те же проблемы, что и у меня. Включение посредника (через модель) в ответы в Django Rest Framework .

class StyleSerializer(serializers.ModelSerializer):
    colors = StyleColorSerializer(source='stylecolor_set',
                                  many=True, read_only=True)

    class Meta:
        model = Style
        fields = ('name', 'colors')
0 голосов
/ 05 июля 2018

Попробуйте этот фрагмент

class ColorSerializer(serializers.ModelSerializer):
    sizes = SizeSerializer(source = 'style_set')
    class Meta:
        model = Color
        <b>fields = ['name','sizes']</b>

class StyleSerializer(serializers.ModelSerializer):
    colors = ColorSerializer(many=True, read_only=True)

    class Meta:
        model = Style
        <b>fields = ['name', 'colors']</b>

Для получения более подробной информации см. Официальный документ DRF

...