首页 > 解决方案 > 如何在 django restframework 中过滤多对多字段值

问题描述

我正在尝试从模型中查询值,我想在查询中包含 manytomanyfield 值,但现在我得到一些数字而不是值,我在 views.py 文件中使用 modelviewset。

我知道做错了什么,如何以正确的方式做到这一点

模型.py

class TrainingDetailsViewSet(viewsets.ModelViewSet):
    queryset = TrainingDetails.objects.all().order_by('Name')
    serializer_class = TrainingDetailsSerializer

视图.py


class TrainingDetails(models.Model):
    Code = models.CharField(max_length=60)
    Name = models.CharField(max_length=60)
    TrainerName = models.ManyToManyField(TrainerDetails, blank=True, related_name='trainer')
    Agenda = models.FileField()
    Date = models.ManyToManyField(Date,blank=True, editable= True, related_name='date')
    Data = models.ManyToManyField(TrainingData, blank=True, related_name='data')
    
    def __str__(self):
        return self.Name

序列化程序.py

class TrainingDetailsSerializer(serializers.ModelSerializer):
    class Meta:
        model = TrainingDetails
        fields = ('Code', 'Name', 'TrainerName', 'Agenda' , 'Date' , 'Data' )

我正在回应,

[
    {
        "Code": "TRA123",
        "Name": "something",
        "TrainerName": [
            5,
            6
        ],
        "Agenda": "something",
        "Date": [
            2
        ],
        "Data": [
            2
        ]
    }
]

我想,

[
    {
        "Code": "TRA123",
        "Name": "something",
        "TrainerName": [
            'john' , 'james'
        ],
        "Agenda": "something",
        "Date": [
            '19/10/2020'
        ],
        "Data": [
            'something'
        ]
    }
]
``

标签: djangodjango-rest-framework

解决方案


您正在寻找StringRelatedField,例如:

class TrainingDetailsSerializer(serializers.ModelSerializer):
    TrainerName = serializers.StringRelatedField(many=True)

    class Meta:
        model = TrainingDetails
        fields = ('Code', 'Name', 'TrainerName', 'Agenda' , 'Date' , 'Data' )

应该注意StringRelatedField的是,查找__str__相关模型的 ,在您的情况下是TrainerDetails.


推荐阅读