从 django rest 框架序列化程序自定义 return 对象
Customize the return object from django rest framework serializer
我想根据特定要求自定义 django rest 框架序列化程序 return 对象。现在它 return 是单个对象中未嵌套的字段。
{
"id": 9,
"namespace": "steve",
"path": "something/another",
"value": "this is a value"
},
这就是我想要的结果:
{
"id": 6,
"namespace": "tempnamespaced",
"path": "randompath",
"value": "anothertest",
"user": {
"userId": "testUser1"
}
}
所以我想添加一个名为 user 的嵌套对象,并在用户中添加 userID 值。
userId 中 return 的数据实际上是 person.username
person 是模型用户名,因此数据在分配时看起来像这样 returned:
"user": {
"userId": {{person.username}}
}
下面附上我的代码:
序列化器:
from rest_framework import serializers
from .models import Preference
from django.contrib.auth.models import User
class PreferenceSerializer(serializers.ModelSerializer):
# person = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(),)
class Meta:
model = Preference
fields = ('id', 'namespace', 'path', 'value')
这是获取视图集:
@permission_classes((IsAuthenticated))
def get_queryset(self):
namespace = self.kwargs.get('namespace', None)
path = self.kwargs.get('path', None)
if namespace is None and path is None:
queryset = Preference.objects.all().filter(user_id=1)
if namespace and path is None:
queryset = Preference.objects.all().filter(user_id=1, namespace=namespace)
if namespace and path:
queryset = Preference.objects.all().filter(user_id=1, namespace=namespace, path=path)
return queryset
模式如下:
from django.db import models
from django.contrib.auth.models import User
from owf_framework.people.models import Person
class Preference(models.Model):
id = models.BigAutoField(primary_key=True, null=False)
version = models.BigIntegerField(default=1, null=False)
path = models.CharField(max_length=200, null=False)
namespace = models.CharField(max_length=200, null=False)
value = models.TextField(null=False)
user_id = models.BigIntegerField(null=False, default=1)
person = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.namespace
class Meta:
db_table = 'preference'
您可以将方法添加到模型中 return 用户名而不是字段名称。
class Preference(models.Model):
id = models.BigAutoField(primary_key=True, null=False)
version = models.BigIntegerField(default=1, null=False)
path = models.CharField(max_length=200, null=False)
namespace = models.CharField(max_length=200, null=False)
value = models.TextField(null=False)
user_id = models.BigIntegerField(null=False, default=1)
person = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.namespace
def get_username(self):
return self.person.username
class Meta:
db_table = 'preference'
Serializer 现在可以使用此方法。
class PreferenceSerializer(serializers.ModelSerializer):
person = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(),)
class Meta:
model = Preference
fields = ('id', 'namespace', 'path', 'value', 'person', 'get_username')
在序列化程序中定义 to_representation()
:
class PreferenceSerializer(serializers.ModelSerializer):
# person = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(),)
class Meta:
model = Preference
fields = ('id', 'namespace', 'path', 'value')
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['user'] = {'userId': instance.person.username}
return ret
我想根据特定要求自定义 django rest 框架序列化程序 return 对象。现在它 return 是单个对象中未嵌套的字段。
{
"id": 9,
"namespace": "steve",
"path": "something/another",
"value": "this is a value"
},
这就是我想要的结果:
{
"id": 6,
"namespace": "tempnamespaced",
"path": "randompath",
"value": "anothertest",
"user": {
"userId": "testUser1"
}
}
所以我想添加一个名为 user 的嵌套对象,并在用户中添加 userID 值。
userId 中 return 的数据实际上是 person.username person 是模型用户名,因此数据在分配时看起来像这样 returned:
"user": {
"userId": {{person.username}}
}
下面附上我的代码:
序列化器:
from rest_framework import serializers
from .models import Preference
from django.contrib.auth.models import User
class PreferenceSerializer(serializers.ModelSerializer):
# person = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(),)
class Meta:
model = Preference
fields = ('id', 'namespace', 'path', 'value')
这是获取视图集:
@permission_classes((IsAuthenticated))
def get_queryset(self):
namespace = self.kwargs.get('namespace', None)
path = self.kwargs.get('path', None)
if namespace is None and path is None:
queryset = Preference.objects.all().filter(user_id=1)
if namespace and path is None:
queryset = Preference.objects.all().filter(user_id=1, namespace=namespace)
if namespace and path:
queryset = Preference.objects.all().filter(user_id=1, namespace=namespace, path=path)
return queryset
模式如下:
from django.db import models
from django.contrib.auth.models import User
from owf_framework.people.models import Person
class Preference(models.Model):
id = models.BigAutoField(primary_key=True, null=False)
version = models.BigIntegerField(default=1, null=False)
path = models.CharField(max_length=200, null=False)
namespace = models.CharField(max_length=200, null=False)
value = models.TextField(null=False)
user_id = models.BigIntegerField(null=False, default=1)
person = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.namespace
class Meta:
db_table = 'preference'
您可以将方法添加到模型中 return 用户名而不是字段名称。
class Preference(models.Model):
id = models.BigAutoField(primary_key=True, null=False)
version = models.BigIntegerField(default=1, null=False)
path = models.CharField(max_length=200, null=False)
namespace = models.CharField(max_length=200, null=False)
value = models.TextField(null=False)
user_id = models.BigIntegerField(null=False, default=1)
person = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.namespace
def get_username(self):
return self.person.username
class Meta:
db_table = 'preference'
Serializer 现在可以使用此方法。
class PreferenceSerializer(serializers.ModelSerializer):
person = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(),)
class Meta:
model = Preference
fields = ('id', 'namespace', 'path', 'value', 'person', 'get_username')
在序列化程序中定义 to_representation()
:
class PreferenceSerializer(serializers.ModelSerializer):
# person = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(),)
class Meta:
model = Preference
fields = ('id', 'namespace', 'path', 'value')
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['user'] = {'userId': instance.person.username}
return ret