Django REST Serializer和unique_together和from_native

时间:2014-06-24 14:36:01

标签: django django-rest-framework

我无法使用SlugRelatedField反序列化属于unique_together集的字段。

举个例子,我有一个博客模型,其中包含标题和作者。 这些元组的元组唯一地标识博客(如标题中对于给定的作者是唯一的,但不是唯一的站点范围)。我想从包含这些值的消息中查找博客。

为了反序列化消息(即from_native),SlugRelatedField调用:self.queryset.get(**{self.slug_field: data})将在Title slug上失败,因为它不是全局唯一的。这可以通过提供更有限的查询集(即只包含博客但该用户的查询集)来解决,但我不确定在字段中设置此查询集的最佳位置是什么/哪里(因为我不知道作者直到我开始反序化那个领域。)

一个想法是在get_fields中对作者进行自己的反序列化,然后我可以过滤Blog的查询集。这段代码非常丑陋,可能会导致Author的反序列化两次,并且在将Serializer用于列表视图时(而不是详细视图)会出现问题。

1 个答案:

答案 0 :(得分:0)

您需要在运行时为字段设置QuerySet。

您可以在序列化程序中执行此操作,例如:

class MyObjectSerializer(serializers.HyperlinkedModelSerializer):
    def get_fields(self, *args, **kwargs):
       fields = super(MyObjectSerializer, self).get_fields(*args, **kwargs)
       fields['slug'].queryset = MyObject.objects.filter(self.context['view'].request.user)
       return fields

或者在视图中:

def get_serializer(self):
    serializer = super(MyObjectView, self).get_serializer()
    serializer.fields['slug'].queryset = MyObject.objects.filter(self.request.user)

同样的事情 - 一旦你有对当前用户的引用,你就会在slug字段上设置QuerySet - 它只取决于哪个最适合你。

我希望有所帮助。