Django REST Framework 中的 ManyToManyField 值

ManyToManyField value in Django REST Framework

所以当我路由到 api/ 查看我的模型时,我没有看到我期望看到的东西。 我想在变量篮子中查看我在 Strat_Basket 模型中分组的 strats 的名称,但我看到的是由 DJANGO 自动生成的它们的 ID。 我想在 strat_basket 视图中看到名称而不是数字。这就是为什么。

models.py

class Strats(models.Model):
    name = models.CharField(max_length=64)
class Strats_Basket(models.Model):
    name = models.CharField(max_length=64)
    basket = models.ManyToManyField(Strats, blank=True, related_name='list')

serializers.py:

class StratsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Strats
        fields = ('id', 'name')
class Strats_BasketSerializer(serializers.ModelSerializer):
    class Meta:
        model = Strats_Basket
        fields = ('id', 'name', 'basket')

views.py:

class StratsView(viewsets.ModelViewSet):
    serializer_class = StratsSerializer
    queryset = Strats.objects.all()
class Strats_BasketView(viewsets.ModelViewSet):
    serializer_class = Strats_BasketSerializer
    queryset = Strats_Basket.objects.all()

urls.py:

router = routers.DefaultRouter()
router.register(r'strats', views.StratsView, 'strats')
router.register(r'strats_basket', views.Strats_BasketView, 'strats_basket')

API 输出:

战略:

[
    {
        "id": 1,
        "name": "strat1"
    },
    {
        "id": 2,
        "name": "strat2"
    },
    {
        "id": 3,
        "name": "strat3"
    },
    {
        "id": 4,
        "name": "strat4"
    },
    {
        "id": 5,
        "name": "strat5"
    },
    {
        "id": 6,
        "name": "strat6"
    }
]

strats_basket: 我想看到 strat1、strat2、strat4 而不是 1、2、4。

[
    {
        "id": 1,
        "name": "Basket 1",
        "basket": [
            1,
            2,
            4
        ]
    },
    {
        "id": 2,
        "name": "Basket 2",
        "basket": [
            3,
            5,
            6
        ]
    }
]

您可以使用 SerializerMethodField 并在方法 return names 列表中使用 values_listflat=True

class Strats_BasketSerializer(serializers.ModelSerializer):
     
    basket = serializers.SerializerMethodField()
     
    def get_basket(self, obj):
        return obj.basket.all().values_list('name', flat=True)

    class Meta:
        model = Strats_Basket
        fields = ('id', 'name', 'basket')