Django (drf) добавляет новые параметры/поля только для вывода с помощью существующего набора запросов(используемого для вывода) из базы данных

#django #django-models #django-rest-framework #django-views #django-serializer

Вопрос:

Я работаю над проектом в drf, где мне нужно извлекать данные из базы данных (в тысячах) и отображать выборочные поля в ответ.

models.py

 class TblDemo(models.Model):
    tbl_id = models.IntegerField()
    tbl_name = models.CharField(max_length=50)
    tbl_size = models.CharField(max_length=50)
    tbl_height = models.Charfield(max_length=50)
    tbl_material = models.Charfield(max_length=50)

    class Meta:
        managed = True
        db_table = 'tbl_demo'
 

views.py

 class data_fetch(viewsets.ViewSet):
    def tbl_list(self, request, format=None)
        serializer = Tbl_Serializer_input(data=request.data)
        if serializer.is_valid():
            queryset1 = tbl_name.objects.all()
            queryset2 = queryset1.filter(tbl_name=request.data.get("title"))
            serializer = Tbl_Serializer_output(queryset2, many=True)
            return Response(serializer.data)
 

serializers.py

 class Tbl_Serializer_input(serializers.Serializer):
    title = serializers.CharField(required=True, max_length=50)
    refer_no = serializers.CharField(required=True, max_length=50)

class Tbl_Serializer_output(serializers.Serializer):
    tbl_id = serializers.CharField(max_length=50)
    tbl_name = serializers.CharField(max_length=50)
    tbl_size = serializers.CharField(max_length=50)
    tbl_height = serializers.Charfield(max_length=50)
 

выход

 [
  {
    "tbl_id":"1", 
    "tbl_name":"white table",
    "tbl_size": "square",
    "tbl_height": "2 feet"
  },
  {
    "tbl_id":"2", 
    "tbl_name":"black table",
    "tbl_size": "square",
    "tbl_height": "3 feet"
  },
  .......and so on.
 

но теперь требуется, чтобы я не мог изменить базу данных/модель, но мне нужно добавить еще несколько полей, таких как («refer_no», «материал» и «плотность», что в целом одинаково во всех случаях) и с каждым объектом в наборе запросов, который не будет храниться в базе данных, но он предназначен только для ответа/вывода.

итак, после добавления новых параметров мой вывод будет выглядеть следующим образом : где «refer_no» берется непосредственно из ввода для отображения выходных полей. и «материал» и «плотность» не могут быть добавлены в базу данных, просто должны быть жестко закодированы в середине.

новый вывод

 [
  {
    "tbl_id":"1", 
    "refer_no":"abadadf",
    "tbl_name":"white table",
    "tbl_size": "square",
    "tbl_height": "2 feet",
    "density": "350gm/in"
    "material": "tek wood"
  },
  {
    "tbl_id":"2", 
    "refer_no":"abadadf",
    "tbl_name":"black table",
    "tbl_size": "square",
    "tbl_height": "3 feet",
    "density": "350gm/in",
    "material": "tek wood"
  },
  .......and so on.
 

Я действительно добавил новые поля с набором запросов из базы данных, но когда он пошел на сериализацию, он показывает ошибку циклического цикла.

Пожалуйста, помогите.

Комментарии:

1. вы пробовали ReadOnlyField в сериализаторах

2. Я думаю, тебе это нужно. В этом методе у вас есть доступ self.request , поэтому у вас есть доступ к входным данным.

Ответ №1:

Вы можете обработать данные внутри сериализатора с помощью этого to_representation метода.

Например:

 
class ModelSerializer(serializers.ModelSerializer):

    ...

    def to_representation(self, instance):
        to_repr = super().to_representation(instance)
        # add here the "refer_no", "material" and "density" key-value per object
        return to_repr