【问题标题】:DRF Many-to-Many reversed serializerDRF 多对多反向串行器
【发布时间】:2021-02-18 19:34:10
【问题描述】:

我想用person_id 做一些api。 但是我不能用这个模型处理我的 ModelSerializers。

如何定义我的序列化程序?

models.py

class Vaccine(models.Model):
    name = models.CharField(max_length=32)
    description = models.CharField(max_length=64)


class Person(models.Model):
    email = models.EmailField(blank=True, null=True, unique=True)
    nickname = models.CharField(max_length=16, blank=True,
    vaccinations = models.ManyToManyField(Vaccine,
                                          through='Vaccination',
                                          through_fields=('person', 'vaccine'))


class Vaccination(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    vaccine = models.ForeignKey(Vaccine, on_delete=models.CASCADE)
    reserved_at = models.DateTimeField()
    is_edited = models.BooleanField()

想要: 获取http://localhost:8000/person/123/vaccinations

{
    'person_id': 123,
    'vaccines': [
        {
            'name': 'Flu',
            'description': 'Flu',
            'vaccinations': [
                {
                    'reserved_at': '2020-12-25',
                    'is_edited': true
                },
                {
                    'reserved_at': '2020-12-31',
                    'is_edited': false
                }
            ]
        }
    ]
}

感谢您的阅读。

【问题讨论】:

    标签: api serialization django-rest-framework many-to-many reverse


    【解决方案1】:

    我已经为你编写了代码。试试这个:

    序列化器:

    from rest_framework.serializers import *
    
    
    class VaccinationSerializer(ModelSerializer):
        class Meta:
            model = Vaccination
            fields = "__all__"
    
    class VaccineSerializer(ModelSerializer):
        vaccinations = SerializerMethodField()
    
        def get_vaccinations(self,instance):
            qs = Vaccination.objects.filter(vaccine =instance.id)
            data = VaccinationSerializer(qs,many=True).data
            return data
    
        class Meta:
            model = Vaccine
            fields = "__all__"
    
    

    观看次数:

    
    class VaccineDetailAPIView(APIView):
        # permission_classes = (IsAuthenticated,)
        def get(self,request,*args,**kwargs):
            _id = self.kwargs['pk']
           
            try:
                obj=Vaccine.objects.get(id=_id)
            except:
                return Response({'success' : 'False','message':'No object found'},status=400)
    
            queryset = Vaccine.objects.filter(id=_id)
            serializer = VaccineSerializer(queryset, many=True, context={'request':request})
            data = serializer.data
    
            if data:
                return Response({
                    'success' : 'True',
                    'message' : 'Data retrieved successfully',
                    'data'    : data,
                },status=200)
    
            else:
                return Response({
                    'message':'No data to retrieve',
                    'success':'False'
                },status=400)
    
    

    网址:

    path('person/<int:pk>/vaccinations', VaccineDetailAPIView.as_view(), name='vaccine_detail'),
    

    【讨论】:

      猜你喜欢
      • 2019-07-25
      • 1970-01-01
      • 2021-03-19
      • 2016-07-17
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      相关资源
      最近更新 更多