Добавьте дополнительные поля данных в ответ на метод записи в Django - PullRequest
0 голосов
/ 17 апреля 2020

Мне нужно показать дополнительные данные поля для ответа POST. Это дополнительное поле данных не вставляется или не обновляется в базе данных, просто хочу получить в ответ. эти дополнительные данные поступают из другой модели. Мне нужно настроить ответ JSON представление

модель

class Country(BaseModel):
    name= models.CharField(null=True)
    state= models.FloatField(null=True)
    class Meta:
        db_table = 'country'
class Tour(BaseModel):
    name = models.ForeignKey(Country, on_delete=models.PROTECT)
    country= models.FloatField(null=True)
    class Meta:
        db_table = 'tour'   


class TourInter(BaseModel):
    tour = models.ForeignKey(Tour, on_delete=models.PROTECT)
    price= models.FloatField(null=True)
    details= models.TextField(null=True, blank=True)
    class Meta:
        db_table = 'tourinternational'

Serializer.py

class TourInterCreateSerializer(serializers.ModelSerializer):
    country = serializers.CharField(required=False,read_only=True)


    class Meta:
        model=TourInter
        fields = ('id','tour','price','country')    
    def validate(self, attrs):
        tour_id=attrs.get('tour').id
        tourintid = TourInter.objects.filter(tour=tour_id)[0].id
        countryobj = Tour.objects.get(id=tourid).country
        country = countryobj.state
        attrs.pop({'country': country})
        attrs = super().validate(attrs)
        return attrs

views.py

class TourInterViewSet(viewsets.ModelViewSet):
    queryset = TourInter.objects.all()
    def get_serializer_class(self):
        if self.action == 'create' or self.action == 'update':
            return TourInterCreateSerializer
        return TourInterSerializer

    def dispatch(self,request,*args,**kwargs):
        response = super(TourInterViewSet, self).dispatch(request, *args, **kwargs)
        data = {}
        data= response.data
        response.data = data
        return response

данные почтальона

запрос:

{
tour_id: 1,
price: 10000
details: "Could be nil"
}

Мне нужен ответ почтальона, например, название страны, имеющей имя ниже, для ответа на почту, здесь страна не вставляется в базу данных:

{
tour_id: 1,
price: 10000
details: "Could be nil",
country: "Country name from country model"#this field should be added in response
}

1 Ответ

1 голос
/ 17 апреля 2020

Обновите сериализатор следующим образом

class TourInterCreateSerializer(serializers.ModelSerializer):
    country = serializers.SerializerMethodField()

    def get_country(self, instance):
        # Get country from country model
        return 'abc' # Write your own logic here

    class Meta:
        model=TripVisa
        fields = ('id','tour','price','country')    
    def validate(self, attrs):
        tour_id=attrs.get('tour').id
        tourintid = TourInter.objects.filter(tour=tour_id)[0].id
        countryobj = Tour.objects.get(id=tourid).country
        country = countryobj.state
        attrs.pop({'country': country})
        attrs = super().validate(attrs)
        return attrs
...