【问题标题】:Django REST Serializer and unique_together and from_nativeDjango REST 序列化器和 unique_together 和 from_native
【发布时间】:2014-06-24 14:36:01
【问题描述】:

我在使用SlugRelatedField 反序列化属于unique_together 集的字段时遇到问题。

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

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

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    您需要在运行时为您的字段设置 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——它只取决于哪个最适合你。

    希望对你有帮助。

    【讨论】:

    • 如果Author不是当前登录的用户,而是在请求中通过用户名传递的怎么办?
    • 然后想一些其他的方法来识别作者。如有必要,请在请求的早期手动执行并将其添加到序列化程序上下文中
    • 我认为这可以通过继承序列化器然后覆盖field_from_native来完成。
    • 有没有办法告诉可浏览 API 为模型上不存在的字段呈现相关的 slug 字段?
    猜你喜欢
    • 1970-01-01
    • 2014-05-02
    • 2016-09-29
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多