Django REST序列化程序和unique_一起使用,并且来自_native

Django REST序列化程序和unique_一起使用,并且来自_native,django,django-rest-framework,Django,Django Rest Framework,我在使用SlugRelatedField反序列化属于unique\u集合一部分的字段时遇到问题 举个例子,我有一个博客模型,它有一个标题和一个作者。 这些元素的元组唯一地标识一个博客(如标题中所示,对于给定的作者来说是唯一的,但在整个站点范围内不是唯一的)。我想从只包含这些值的消息中查找博客 为了反序列化消息(即来自_native),SlugRelatedField调用:self.queryset.get(**{self.slug\u field:data}),这将在标题slug上失败,因为它不

我在使用
SlugRelatedField
反序列化属于
unique\u集合一部分的字段时遇到问题

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

为了反序列化消息(即来自_native
),
SlugRelatedField
调用:
self.queryset.get(**{self.slug\u field:data})
,这将在标题slug上失败,因为它不是全局唯一的。这可以通过提供一个更有限的查询集(即只包含博客但不包含该用户的查询集)来解决,但我不确定如何/在哪里最好地在字段中设置该查询集(因为在反序列化该字段之前,我不知道作者)


一个想法是在get_字段中对作者进行我自己的反序列化,然后过滤博客的查询集。这段代码非常难看,可能导致两次对作者进行反序列化,并且在将序列化程序用于列表视图(与详细视图相反)时出现问题。

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

您可以在serialiser中执行此操作,例如:

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——这取决于哪个最适合你


我希望这会有所帮助。

如果作者不是当前登录的用户,但在请求中通过用户名传递,那该怎么办?然后考虑其他方法来识别作者。如果有必要,在请求的早期手动执行,并将其添加到序列化程序上下文中。我认为可以通过对序列化程序进行子类化,然后从_native重写
字段来完成。是否有任何方法告诉可浏览API为模型上不存在的字段呈现相关的slug字段?