Мне нужно показать связанные поля, которые имеют много ко многим отношения с той же моделью. Джанго Отдых Каркасная работа - PullRequest
0 голосов
/ 04 сентября 2018

Я пытаюсь создать поле для связанного продукта. Я добавил поле в модели, имеющее отношение многие ко многим, и установил его на себя, так как я выберу соответствующий продукт вручную.

class ProductsSerializer(serializers.ModelSerializer):

    images = ImagesSerializer(many=True)
    color = ColorSerializer(many=False)

    class Meta:
        fields = (
            'url',
            'id',
            "code",
            "sku",
            "title",
            "slug",
            "state",
            "old_price",
            "price",
            "valid",
            "in_stock",
            "category",
            "related_products",
            "color",
            "images",
            "video",
            "description",
            "fabric",
            "model_size_info",
        )
        model = Products

Я не могу сослаться на тот же Serializer, который мне нужен, чтобы получить информацию о продукте в API JSON. Я не могу найти способ сделать это.

Заранее спасибо за помощь, ребята.

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Прежде всего, я думаю, что вы должны использовать что-то вроде DynamicFieldsModelSerializer для предотвращения рекурсии

class DynamicFieldsModelSerializer(serializers.ModelSerializer):
    """
    A ModelSerializer that takes an additional `fields` argument that
    controls which fields should be displayed.
    """

    def __init__(self, *args, **kwargs):
        # Don't pass the 'fields' arg up to the superclass
        fields = kwargs.pop('fields', None)

        # Instantiate the superclass normally
        super(DynamicFieldsModelSerializer, self).__init__(*args, **kwargs)

        if fields is not None:
            # Drop any fields that are not specified in the `fields` argument.
            allowed = set(fields)
            existing = set(self.fields)
            for field_name in existing - allowed:
                self.fields.pop(field_name)

затем, Вы можете использовать SerializerMethodField, а также указать поля, которые вы хотите в соответствующих продуктах («не проходите related_products, чтобы предотвратить рекурсию»):

class ProductsSerializer(DynamicFieldsModelSerializer):
    images = ImagesSerializer(many=True)
    related_products = serializers.SerializerMethodField()

    def get_related_products(self, obj):
        return ProductsSerializer(obj.related_products, many=True, fields=('url', 'id', "title", "images")).data


    class Meta:
        fields = (
            'url',
            'id',
            "title",
            "related_products",
            "images",
        )
        model = Products
0 голосов
/ 05 сентября 2018

Вот решение, с которым я столкнулся. Я создал еще один сериализатор

class ProductsSerializerTemp(serializers.ModelSerializer):
    color = ColorSerializer(many=False)

    class Meta:
        fields = (
            "color",
            "url"
        )
        model = Products

и чем я отослал его на мой оригинальный сериализатор

class ProductsSerializer(serializers.ModelSerializer):

    images = ImagesSerializer(many=True)
    color = ColorSerializer(many=False)
    related_products = ProductsSerializerTemp(many=True)


    class Meta:
        fields = (
            'url',
            'id',
            "code",
            "sku",
            "title",
            "slug",
            "state",
            "old_price",
            "price",
            "valid",
            "in_stock",
            "category",
            "related_products",
            "color",
            "images",
            "video",
            "description",
            "fabric",
            "model_size_info",
        )
        model = Products

Я в значительной степени выполнил работу, я не уверен, что это лучшее решение, но оно сработало очень хорошо.

0 голосов
/ 04 сентября 2018

Метод-1: Переопределить метод __init__()

class ProductsSerializer_Temp(serializers.ModelSerializer):
    images = ImagesSerializer(many=True)

    class Meta:
        fields = (
            'url',
            'id',
            "title",
            "images",
        )
        model = Products


class ProductsSerializer(ProductsSerializer_Temp):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields.update(
            {"related_products": ProductsSerializer_Temp()}
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...