之前我问过这个问题,但清晰度较低
如何将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
我的问题是如何自动存储该外键中的Album
或pk
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})
答案 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_name
和request.data
来自album_id
传入的额外kwarg
答案 1 :(得分:0)
在我需要使用的序列化器内部:
self.context.get("request").parser_context["kwargs"]["album_id"]