Python Django嵌套对象,不同的序列化程序获取和发布
这是我这个问题的后续问题 现在,我可以使用用户主键发布一个新的AP对象,并在AP序列化程序Python Django嵌套对象,不同的序列化程序获取和发布,python,django,serialization,nested,Python,Django,Serialization,Nested,这是我这个问题的后续问题 现在,我可以使用用户主键发布一个新的AP对象,并在AP序列化程序user=UserIndexSerializer()中注释这一行之后: 邮递员要求: { “用户”:1, “名称”:“最大AP 05” } 然而,我现在遇到的问题是,初始UserIdexSerializer变得无用 此序列化程序确定要在GET请求中显示的字段,但结果是在POST请求中强制使用所需的字段。 我想做的是: 仅使用用户ID发布新AP对象 在GET请求期间显示UserIndexSerialize
user=UserIndexSerializer()
中注释这一行之后:
邮递员要求:
{
“用户”:1,
“名称”:“最大AP 05”
}
然而,我现在遇到的问题是,初始UserIdexSerializer变得无用
此序列化程序确定要在GET请求中显示的字段,但结果是在POST请求中强制使用所需的字段。
我想做的是:
- 仅使用用户ID发布新AP对象
- 在GET请求期间显示UserIndexSerializer字段(名字, 姓氏,但不是ID)
从rest\u框架导入序列化程序
来自..models.model\u art\u工件导入AP
从.serializers\u用户导入*
类APIndexSerializer(serializers.ModelSerializer):
user=UserIndexSerializer()
类元:
型号=AP
字段=[
“id”,
“用户”,
“姓名”
]
类APCreateSerializer(serializers.ModelSerializer):
user=UserIDSerializer()
类元:
型号=AP
字段=[
“id”,
“用户”,
“姓名”
]
def创建(自我验证的_数据):
ap=ap.objects.create(**已验证的_数据)
返回ap
类APDetailsSerializer(serializers.ModelSerializer):
类元:
型号=AP
字段='\uuuu所有\uuuu'
我还尝试创建不同的序列化程序:
从rest\u框架导入序列化程序
from..models.model\u用户导入用户
类UserIndexSerializer(serializers.ModelSerializer):
类元:
模型=用户
字段=[
“名字”,
“姓”
]
类UserIDSerializer(serializers.ModelSerializer):
类元:
模型=用户
字段=[
“身份证”
]
类UserDetailsSerializer(serializers.ModelSerializer):
类元:
模型=用户
字段='\uuuu所有\uuuu'
这根本不起作用,有人能帮我吗?我将给你一个例子来解释如何在GET/POST中为关系字段使用不同的序列化程序 有一个票证模型,它有一个外键引用用户模型。在创建票证的帖子中,您需要用户id来创建对象。在GET-to-GET票证的详细信息中,您希望显示用户的详细信息,而不是ID
Ticket(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
然后,在序列化程序文件中
class UserDetailSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('first_name', 'last_name')
class TicketPostSerializer(serializer.ModelSerializer):
class Meta:
model = Ticket
fields = '__all__'
class TicketDetailSerializer(serializer.ModelSerializer):
user = UserDetailSerializer(read_only=True)
class Meta:
model = Ticket
fields = '__all__'
然后,在票证的查看功能中,您有:
class TicketViewSet(viewsets.ModelViewSet):
serializer_class = TicketPostSerializer
def get_serializer_class(self):
if self.action in ['list', 'retrieve']:
return TicketDetailSerializer
一切就绪,您就可以开始了。我将给您一个示例来解释如何在GET/POST中为关系字段使用不同的序列化程序 有一个票证模型,它有一个外键引用用户模型。在创建票证的帖子中,您需要用户id来创建对象。在GET-to-GET票证的详细信息中,您希望显示用户的详细信息,而不是ID
Ticket(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
然后,在序列化程序文件中
class UserDetailSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('first_name', 'last_name')
class TicketPostSerializer(serializer.ModelSerializer):
class Meta:
model = Ticket
fields = '__all__'
class TicketDetailSerializer(serializer.ModelSerializer):
user = UserDetailSerializer(read_only=True)
class Meta:
model = Ticket
fields = '__all__'
然后,在票证的查看功能中,您有:
class TicketViewSet(viewsets.ModelViewSet):
serializer_class = TicketPostSerializer
def get_serializer_class(self):
if self.action in ['list', 'retrieve']:
return TicketDetailSerializer
一切就绪,您可以自由移动。如果我理解正确,您希望的是在获取过程中获取嵌套对象。我在序列化程序中解决了相同的问题
class APIndexSerializer(serializers.ModelSerializer):
class Meta:
model = AP
fields = ['id','user','name']
def to_representation(self, obj):
self.fields['user'] = UserIndexSerializer()
return super(APIndexSerializer, self).to_representation(obj)
您可以使用此命令创建id,并获取用户的嵌套信息 如果我理解正确,那么您想要的是在get期间获取嵌套对象。我在序列化程序中解决了相同的问题
class APIndexSerializer(serializers.ModelSerializer):
class Meta:
model = AP
fields = ['id','user','name']
def to_representation(self, obj):
self.fields['user'] = UserIndexSerializer()
return super(APIndexSerializer, self).to_representation(obj)
您可以使用此命令创建id,并获取用户的嵌套信息 我知道你在@JunZhou做了什么,但是当我尝试它时,它给了我错误
'AP'对象没有属性'action'
我知道你在@JunZhou做了什么,但是当我尝试它时,它给了我错误'AP'对象没有属性'action'
只是为了更好地理解to_表示方法的返回。obj是否在to_表示法(obj)中传递给使用super()函数创建的对象,该函数继承自序列化程序和当前正在处理的AP实例?只是为了更好地理解to_表示法的返回。obj是否在to_表示(obj)中传递给使用super()函数创建的对象,并从序列化程序和正在处理的当前AP实例继承?