#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