【发布时间】:2017-10-05 05:16:38
【问题描述】:
在本教程中,序列化器字段和模型字段之间存在这种松散的一对一映射。我可以预期,如果序列化器字段和模型字段都是 CharFields,它将在反序列化为模型实例时保存一串字符:
models.py:
class Deck(models.Model):
created = models.DateTimeField(auto_now_add=True)
name = models.CharField(max_length=100, unique=True, blank=False, null=False)
serializers.py:
class DeckSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Deck
fields = ('url', 'id', 'created', 'name')
extra_kwargs = {
'url': {
'view_name': 'goals:deck-detail',
}
}
但是当我尝试建立关系时,序列化器字段是 ReadOnlyField,据我了解,它本质上是一个 Charfield,但模型字段是 ForeignKeyField,更令人困惑的是,我好像在保存一个当我覆盖 perform_create 时视图中的对象:
models.py:
class Deck(models.Model):
created = models.DateTimeField(auto_now_add=True)
name = models.CharField(max_length=100, unique=True, blank=False, null=False)
user = models.ForeignKey('users.User', related_name='decks', on_delete=models.CASCADE, null=False)
serializers.py:
class DeckSerializer(serializers.HyperlinkedModelSerializer):
user = serializers.ReadOnlyField(source='user.username')
class Meta:
model = Deck
fields = ('url', 'id', 'created', 'name', 'user')
extra_kwargs = {
'url': {
'view_name': 'goals:deck-detail',
}
}
views.py:
class DeckList(generics.ListCreateAPIView):
serializer_class = DeckSerializer
def get_queryset(self):
return Deck.objects.all().filter(user__username=self.request.user)
def perform_create(self, serializer):
serializer.save(user=self.request.user)
这里发生了什么?在处理关系时,为什么我要通过在视图中覆盖 perform_create、在序列化程序中声明 CharField 以及在模型中声明关系字段来保存对象?
在我的理解中缺少什么,或者引擎盖下到底发生了什么,使得用户字段 (ForeignKey) 可以表示为字符串但保存为对象?
编辑:
如果我在视图中覆盖 serializer.save(user=user) 并且 serializers.py 的用户字段为
user = serializers.CharField(read_only=True)
我想覆盖 serializers.py 中的 save 方法,如何传递正确的数据以便它知道如何序列化?我是否只是抓取整个用户对象,保存它,然后它会完成其余的工作?视图中的 serializers.save() 覆盖是否与 serializers.py 中的 serializers.save() 相同?
【问题讨论】:
标签: python django api serialization django-rest-framework