使用 ModelViewSet 时 Django 休息框架发布请求

时间:2020-12-19 14:07:43

标签: django django-rest-framework django-views

我是 Django 新手,有 Node.js 背景。

我正在使用 DjangoDjango 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 中一般处理这类问题?

1 个答案:

答案 0 :(得分:0)

我按照上面评论中@BriseBalloches 的建议设法解决了这个问题。

总而言之,通过添加 event_posted_by 键更新了 read_only

event_posted_by = UserSerializer(read_only=True)