我是 Django 新手,有 Node.js 背景。
我正在使用 Django、Django rest 框架 和 PostgreSQL 创建一个 API。
# Model for Event.
class Event(models.Model):
heading = models.TextField()
event_posted_by = models.ForeignKey(
CustomUser, on_delete=models.CASCADE, related_name='events_posted', null=True)
event_construction_site = models.ForeignKey(
ConstructionSite, on_delete=models.CASCADE, related_name='construction_site_events', null=True)
def __str__(self):
return str(self.id)
# Event ViewSet
class EventViewSet(viewsets.ModelViewSet):
queryset = Event.objects.all()
serializer_class = EventSerializer
# Event Serializer
class EventSerializer(serializers.ModelSerializer):
event_construction_site = ConstructionSiteShortSerializer()
event_posted_by = CustomUserSerializer()
class Meta:
model = Event
fields = ('id', 'heading',
'event_posted_by', 'event_construction_site')
这里一切正常,也符合预期。
这是我的 GET Request
的输出。
{
"id": 2,
"heading": "ABCD",
"event_posted_by": {
"id": 1,
"email": "abcd@gmail.com",
"first_name": "A",
"last_name": "B",
"profile_picture": "...",
"company": {
"id": 3,
"name": "Company 3"
},
},
"event_construction_site": {
"id": 2
}
},
但是现在当涉及到创建事件时,这是 django rest 框架 向我展示的视图。
{
"heading": "",
"event_posted_by": {
"email": "",
"first_name": "",
"last_name": "",
"company": {
"name": ""
},
"profile_picture": "",
"user_construction_site": []
},
"event_construction_site": {}
}
据我所知,在 GET 请求中何时需要 "event_posted_by"
但我们不想发布用户信息。在创建事件时,对于像 user_construction_site
这样的用户内部信息,我想要的唯一行为是将用户 ID
发送到后端,并以某种方式在我的 class EventViewSet(viewsets.ModelViewSet)
中处理此发布请求并映射 { {1}} 使用从客户端发送的用户 "event_posted_by"
到用户数据。
如何通过创建不同的读/写 serailizers 在 DRF 中一般处理这类问题?
答案 0 :(得分:0)
我按照上面评论中@BriseBalloches 的建议设法解决了这个问题。
总而言之,通过添加 event_posted_by
键更新了 read_only
。
event_posted_by = UserSerializer(read_only=True)