【发布时间】:2015-10-15 19:00:15
【问题描述】:
如何将参数从 views.py 传递给 serializers.RelatedField 类。我需要通过 language_id 来查询该相关字段中的 Language.objects 模型。
我不确定我是否对这个问题采取了正确的方法。我想要实现的是根据语言从数据库模型中呈现与电影相关的流派信息。 MovieGenre 模型有流派 ID 字段,我想用实际流派名称替换它。
我的序列化器.py
class GenreField(serializers.RelatedField):
def to_representation(self, value, language_id=1):
genre_name = GenresVideo.objects.get(genre_id=value, language_id=language_id)
return genre_name.name
class MovieGenresSerializer(serializers.ModelSerializer):
genre_id = GenreField(read_only=True)
class Meta:
model = MoviesGenres
如您所见,这里我使用默认值查询 Language.objects,但我想从视图 (language_id) 中传递它。
我的意见.py:
class MovieGenresTestViewSet(viewsets.ModelViewSet):
lookup_field = 'movie'
queryset = MoviesGenres.objects.all()
serializer_class = MovieGenresSerializer
def list(self, request, language_pk):
queryset = MoviesGenres.objects.all()
serializer = MovieGenresSerializer(queryset, many=True)
return Response(serializer.data)
def retrieve(self, request, movie, language_pk):
queryset = MoviesGenres.objects.filter(movie=movie)
serializer = MovieGenresSerializer(queryset, many=True)
return Response(serializer.data)
还有我的 urls.py:
router.register(r'lang', LanguagesViewSet, base_name='lang')
mov_gen = routers.NestedSimpleRouter(router, r'lang', lookup='language')
mov_gen.register(r'mg', MovieGenresTestViewSet, base_name='mg')
url(r'^api/', include(genre_spec.urls))
我的模型.py
class Languages(models.Model):
name = models.CharField(unique=True, max_length=255)
short_name = models.CharField(unique=True, max_length=4, blank=True, null=True)
active = models.BooleanField(default="")
class Meta:
managed = False
db_table = 'languages'
ordering = ('id',)
class GenresVideo(models.Model):
genre_id = models.IntegerField()
language = models.ForeignKey('Languages')
name = models.CharField(max_length=255, blank=True, null=True)
class Meta:
managed = False
db_table = 'genres_video'
unique_together = (('genre_id', 'language'),)
ordering = ('genre_id',)
class MoviesGenres(models.Model):
movie = models.ForeignKey(Movies)
genre_id = models.IntegerField()
class Meta:
managed = False
db_table = 'movies_genres'
unique_together = (('movie', 'genre_id'),)
通过 urls 路由,我可以从 API 获得正确的响应,包括 language_id。我只需要以某种方式将其传递给视图。
非常感谢您的帮助!
【问题讨论】:
-
我不确定您是否正确设置了路线。您的两个相关模型如何:流派和语言?你能分享他们的描述吗?
-
我在原始帖子中添加了 models.py 的相关部分。路线按我的预期工作,所以当我发送这样的查询时:/api/lang/1/mg/33/ 我确实得到了该特定电影正确语言的正确流派列表。为了便于阅读,我只发布了我认为与此案例相关的内容,但我也可能遗漏了一些关键部分。