在Django REST Framework中代替主键发送不同的字段 [英] Instead of Primary Key Send Different Field in Django REST Framework
问题描述
serializers.py
class MovieSerializer(serializers.ModelSerializer):
class Meta:
model = Movie
fields = [
'popularity',
'director',
'genre',
'imdb_score',
'name',
]
views.py
class MovieList(generics.ListCreateAPIView):
queryset = Movie.objects.all().order_by('-id')[:10]
serializer_class = MovieSerializer
permission_classes = (IsAuthenticated,)
def list(self, request):
queryset = self.get_queryset()
serializer = MovieSerializer(queryset, many=True)
return Response(serializer.data)
def post(self, request, format=None):
data = request.data
if isinstance(data, list):
serializer = self.get_serializer(data=request.data, many=True)
else:
serializer = self.get_serializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
我发送这样的数据,它可以正常工作。
I send my data like this and it works correctly.
{
"popularity": 83.0,
"director": "Victor Fleming",
"genre": [
1,
2,
3,
4
],
"imdb_score": 8.3,
"name": "The Wizard of Oz"
}
但是我想发送如下数据:
But I want to send the data somewhat like this:
{
"popularity": 83.0,
"director": "Victor Fleming",
"genre": [
"Adventure",
"Family",
"Fantasy",
"Musical"
],
"imdb_score": 8.3,
"name": "The Wizard of Oz"
}
请参阅流派列表-我将发送 name
而不是主键。
See the Genre List - Instead of Primary Key I am sending name
.
这些是我的模型:
class Genre(models.Model):
name = models.CharField(max_length=30, unique=True) # make unique
def __str__(self):
return self.name
class Movie(models.Model):
popularity = models.FloatField(max_length=10)
director = models.CharField(max_length=30)
genre = models.ManyToManyField(Genre)
imdb_score = models.FloatField(max_length=10)
name = models.CharField(max_length=30)
即使我在列出数据或获取数据时也应发送流派名称而不是ID。我尝试使用 StringRelatedField
,但这给了我错误。
Even when I am listing data or getting the data it should send genre name instead of id. I tried to use StringRelatedField
, but it gave me error.
NotImplementedError / api / movie /
必须实现StringRelatedField.to_internal_value()。
NotImplementedError at /api/movie/ StringRelatedField.to_internal_value() must be implemented.
推荐答案
如下重写序列化程序的 create()
方法,
Override the create()
method of the serializer as below,
class MovieSerializer(serializers.ModelSerializer):
genre = serializers.ListSerializer(child=serializers.CharField())
class Meta:
model = Movie
fields = [
'popularity',
'director',
'genre',
'imdb_score',
'name',
]
def create(self, validated_data):
genre = validated_data.pop('genre',[])
movie = super().create(validated_data)
genre_qs = Genre.objects.filter(name__in=genre)
movie.genre.add(*genre_qs)
return movie
这篇关于在Django REST Framework中代替主键发送不同的字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!