在序列化程序[django REST API]中从详细路径存储pk

时间:2016-06-10 18:31:08

标签: python django django-rest-framework

之前我问过这个问题,但清晰度较低

如何将id保存在RelatedFiled的{​​{1}}内?

我在django上测试一个应用程序,我有两个模型:

ForeignKey

class Album(models.Model): album_id = models.IntegerField() artist = models.CharField(max_length=260) album_name = models.CharField(max_length=260) class Song(models.Model): album = models.ForeignKey(Album, related_name='song', blank=True, null=True) #foreign key song_name = models.CharField(max_length=260) 包含Song

的外键

我的问题是如何自动存储该外键中的Albumpk id

我已设置album,当我打印detail_route时,我会在网址中找到我想要访问的正确

例如:album_id会将album/101/song打印为101.但在我的序列化程序中,它不会将RelatedField保存为101.如何解决此问题?

album_id

串行

    @detail_route(methods=['post', 'get'], serializer_class=SongSerialiser)
    def get_so(self, request, album_id=None):
        serializer = self.get_serializer(data=request.data, context={"album_id": album_id })
        if serializer.is_valid():
            print album_id # this works !
            serializer.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response({"detail": serializer.errors,
                             "status_code": status.HTTP_400_BAD_REQUEST})

2 个答案:

答案 0 :(得分:0)

您可以通过album_id 传递context,而不是在album_id中传递serializer.save(),而DRF会自动创建Song个对象使用album_id字段。

您需要对代码进行一些更改。

在您的视图中,您无需将context传递给序列化程序。您应该在album_id中传递serializer.save()

@detail_route(methods=['post', 'get'], serializer_class=SongSerialiser)
def get_so(self, request, album_id=None):
    serializer = self.get_serializer(data=request.data)
    if serializer.is_valid():
        serializer.save(album_id=album_id) # pass album_id here
        return Response(serializer.data, status=status.HTTP_200_OK)
    else:
        return Response({"detail": serializer.errors,
                         "status_code": status.HTTP_400_BAD_REQUEST})

其次,您可以将SongSerialiser转换为只有ModelSerializer字段的song_name,而无需添加create()方法。

class SongSerialiser(serializers.ModelSerializer): # use modelserializer

    class Meta:
        model = Song
        fields = ['song_name'] # only define song_name field

serializer.save()被调用时,DRF将使用来自Song的{​​{1}} song_namerequest.data来自album_id传入的额外kwarg

答案 1 :(得分:0)

在我需要使用的序列化器内部:

self.context.get("request").parser_context["kwargs"]["album_id"]