0

我正在尝试将来自相关集的单个属性的数据嵌套在我的一个 DRF 序列化程序中。

到目前为止,我只能通过一个中间序列化程序来做到这一点,这看起来很乱。我想直接做。

截至目前,这是我的结果的结构:

[
    {
        "id": 1,
        "name": "Pinot Noir",
        "wine_list": [
            {
                "id": 1,
                "wine": {
                    "id": 1,
                    "name": "Juan Gil"

                }
            }
        ]
    }
]

额外的“wine_list”是多余的,肯定是不必要的。我用下面的代码实现了这一点。

这些是我的模型。我已将它们简化为仅包含必要的信息。

class Varietal(models.Model):
    name = models.CharField(max_length=50)


class Wine(models.Model):
    name = models.CharField(max_length=100)


class WineVarietal(models.Model):
    wine = models.ForeignKey(Wine, on_delete=models.CASCADE)
    varietal = models.ForeignKey(Varietal, on_delete=models.CASCADE)

这些是我现在正在使用的序列化程序。

class VarietalDetailWineSerializer(ModelSerializer):
    class Meta:
        model = Wine
        fields = ['id', 'name']


class VarietalDetailWineVarietalSerializer(ModelSerializer):
    wine = VarietalDetailWineSerializer()

    class Meta:
        model = WineVarietal
        fields = ['id', 'wine']


class VarietalDetailSerializer(ModelSerializer):
    wine_list = VarietalDetailWineVarietalSerializer(source='winevarietal_set', many=True)

    class Meta:
        model = Varietal
        fields = ['id', 'name', 'wine_list']

理想情况下,我会得到这样的东西:

[
    {
        "id": 1,
        "name": "Pinot Noir",
        "wine": [
            {
                "id": 1,
                "name": "Juan Gil"

            }
        ]
    }
]

代码有点像这样:

class VarietalDetailWineSerializer(ModelSerializer):
    class Meta:
        model = Wine
        fields = [
            'id',
            'name',
        ]


class VarietalDetailSerializer(ModelSerializer):
    wine = VarietalDetailWineSerializer(source='winevarietal_set.wine', many=True)

    class Meta:
        model = Varietal
        fields = [
            'id',
            'name',
            'wine',
        ]

但是那个源值是无效的。

和平。

4

1 回答 1

1

实现此目的的一种可能方法是使用serializerMethodField.

class VarietalDetailSerializer(ModelSerializer):
    wine = SerializerMethodField()

    class Meta:
        model = Varietal
        fields = [
            'id',
            'name',
            'image',
            'description',
            'wine',
            'active'
        ]

    def get_wine(self, varietal):
        wine_varietals = varietal.winevarietal_set.all()

        wine = [wine_varietals.wine for wine_varietals in wine_varietals]

        return VarietalDetailWineSerializer(instance=wine, many=True).data

我们的主要目标是从自定义序列化方法添加many-to-many字段响应。

于 2019-09-19T05:49:18.413 回答