DRF通过相关模型数据序列化
DRF serialize through related models data
我遇到了 DRF 序列化问题。我的主要目标是创建一个具有相关字段的实例,而不是提供相关模型 id
我想使用它的其他独特字段。同时,当我序列化我的模型以呈现它(而不是创建)时,我想获得默认的相关字段值。这是一个例子
class Comment(models.Model):
description = models.TextField()
creator = models.ForeignKey(User, ...)
x = Creator.objects.get(pk=1)
print(x.unique_field)
> 'some data'
client.post('comment-detail', data={
'description': 'some description',
'creator_unique_field': 'some data'
})
# this should create a comment while using some unique creators field
# which is not pk or id
print(client.get('comment-detail', data={'pk':1}))
{
'description' 'some description',
'creator': 1,
}
我不知道是否应该更改 ViewSet 的 create()
和 retrieve()
的模型序列化程序。我从 DRF 开始,无法理解它
覆盖 Serializer create 方法是一个很好的地方。可以在那里查询 unique_field
用户。
class CommentView(viewsets.ModelViewSet):
def perform_create(self, serializer):
serializer.save(creator=self.request.user)
class CommentSerializer(serializers.Serializer):
creator_unique_field = serializer.SomeField()
def create(self, validated_data):
creator = Creator.objects.get(unique_field=validated_data['creator_unique_field'])
comment, created = Comment.objects.get_or_create(creator=creator, **validated_data)
return comment
class Meta:
model = Comment
fields = '__all__'
我遇到了 DRF 序列化问题。我的主要目标是创建一个具有相关字段的实例,而不是提供相关模型 id
我想使用它的其他独特字段。同时,当我序列化我的模型以呈现它(而不是创建)时,我想获得默认的相关字段值。这是一个例子
class Comment(models.Model):
description = models.TextField()
creator = models.ForeignKey(User, ...)
x = Creator.objects.get(pk=1)
print(x.unique_field)
> 'some data'
client.post('comment-detail', data={
'description': 'some description',
'creator_unique_field': 'some data'
})
# this should create a comment while using some unique creators field
# which is not pk or id
print(client.get('comment-detail', data={'pk':1}))
{
'description' 'some description',
'creator': 1,
}
我不知道是否应该更改 ViewSet 的 create()
和 retrieve()
的模型序列化程序。我从 DRF 开始,无法理解它
覆盖 Serializer create 方法是一个很好的地方。可以在那里查询 unique_field
用户。
class CommentView(viewsets.ModelViewSet):
def perform_create(self, serializer):
serializer.save(creator=self.request.user)
class CommentSerializer(serializers.Serializer):
creator_unique_field = serializer.SomeField()
def create(self, validated_data):
creator = Creator.objects.get(unique_field=validated_data['creator_unique_field'])
comment, created = Comment.objects.get_or_create(creator=creator, **validated_data)
return comment
class Meta:
model = Comment
fields = '__all__'