我正在尝试在 django-rest-framework 中首次实现嵌套序列化程序我的要求是我需要以下形式的响应数据:-
{
id: 0,
title: "Fresh",
data: [
[{
image: ".../assets/images/banana.jpeg",
name: "Fruits",
image_scaling: 2,
API: "http://database_api"
},
{
image: "../assets/images/banana.jpeg",
name: "Vegetables",
image_scaling: 2,
API: "http://database_api"
},
{
image: "../assets/images/banana.jpeg",
name: "Exotic Vegetables",
image_scaling: 2,
API: "http://database_api"
}
]
]
}
我正在验证 get api 的令牌并列出 DB 中的对象。我目前对 views.py 的实现是:-
class home(APIView):
def get(self,request,format=None):
header_token = request.META.get('HTTP_AUTHORIZATION', None)
if header_token is not None:
token = header_token
access_token=token.split(' ')[1]
print(access_token)
if(validate_token(access_token) == None):
raise NotFound('user does exist')
queryset=Fresh.objects.all().select_related('data')
print(queryset)
serializer = FreshSerializer(queryset,many=True)
return Response(serializer.data)
Serializer.py 是:-
class DataSerializer(serializers.ModelSerializer):
class Meta:
model=data
fields = ('name','image_scaling','image')
class FreshSerializer(serializers.ModelSerializer):
data=DataSerializer(read_only=True, many=False)
class Meta:
model = Fresh
fields = ('title','data')
models.py 是:-
class data(models.Model):
name=models.CharField(max_length=9,null=True)
image_scaling=models.IntegerField(default=0,null=True)
image=models.URLField(max_length = 200)
def __str__(self):
return str(self.name)
class Fresh(models.Model):
title=models.CharField(max_length=9)
data=models.ForeignKey(data,on_delete=models.CASCADE,default=None, null=True)
def __str__(self):
return str(self.title)+" " +str(self.data)
我目前的输出是:-
[
{
"title": "vegetable",
"data": {
"name": "vegetable",
"image_scaling": 2,
"image": "https......jpg"
}
},
{
"title": "exoticveg",
"data": {
"name": "exoticveg",
"image_scaling": 2,
"image": "https://.......jpg"
}
} ]
我试图通过 listapiview 和 modelviewset 来做,但我无法获得所需的输出。我在堆栈溢出中看到了类似的查询,但似乎没有解决方案对我有用。我没有得到外键对象的列表,是我的模型做错了什么还是运行了错误的查询?我真的很坚持。我该怎么办。请帮忙!!!
我认为您以错误的方式设计了模型:
在你想要的 json 中,每个新鲜的都有很多数据,所以你的模型应该是这样的:
class data(models.Model):
name=models.CharField(max_length=9, null=True)
image_scaling=models.IntegerField(default=0, null=True)
image=models.URLField(max_length=200)
data=models.ForeignKey(
Fresh, on_delete=models.CASCADE, related_name="fresh_data",
)
def __str__(self):
return str(self.name)
class Fresh(models.Model):
title=models.CharField(max_length=9)
def __str__(self):
return str(self.title)
你的序列化程序应该是这样的:
class DataSerializer(serializers.ModelSerializer):
class Meta:
model=data
fields = ('name', 'image_scaling', 'image')
class FreshSerializer(serializers.ModelSerializer):
data = serializer.SerializerMethodField(read_only=True)
class Meta:
model = Fresh
fields = ('id', 'title', 'data')
def get_data(self, obj):
return DataSerializer(obj.fresh_data, many=True).data
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句