我有一个DRFAPI,它支持在authorsGet请求中包含作者的书籍.

我们的API有一个软删除系统,书(2)被标记为已删除.

但当我提出以下要求时,第(2)册仍然包含在回复中.

我只想要一本书作为对这个请求的回应.

GEThttp://localhost/authors/2?include=books

API返回给我:

{
    "data": {
        "type": "Author",
        "id": "2",
        "attributes": {...},
        "relationships": {
            "books": {
                "meta": {
                    "count": 2
                },
                "data": [
                    {
                        "type": "Book",
                        "id": "1"
                    },
                    {
                        "type": "Book",
                        "id": "2"
                    }
                ]
            }
        }
    },
    "included": [
        {
            "type": "Book",
            "id": "1",
            "attributes": {...}
        },
        {
            "type": "Book",
            "id": "2",
            "attributes": {...}
        }
    ]
}

我有一个BaseModel,用来处理覆盖delete方法的软删除:

class BaseModel(Model):
    archive = BoolYesNoField(db_column="archive", default=False, null=False)
    created = DateTimeField(db_column="created", auto_now_add=True, null=False)
    updated = DateTimeField(db_column="updated", auto_now=True, null=False)

    objects = BaseManager()
    all_objects = BaseManager(alive_only=False)

    def delete(self):
        self.archive = True
        self.save()
        relate_obj_delete(self)

    def hard_delete(self):
        super(Model, self).delete()

    def undelete(self):
        self.archive = False
        self.save()

Manager

class BaseManager(Manager):
    def __init__(self, *args, **kwargs):
        self.alive_only = kwargs.pop("alive_only", True)
        super(BaseManager, self).__init__(*args, **kwargs)

    def get_queryset(self):
        if self.alive_only:
            return BaseQuerySet(self.model).filter(archive=False)
        return BaseQuerySet(self.model)

    def hard_delete(self):
        return self.get_queryset().hard_delete()

AuthorViewSet

class AuthorViewSet(BaseViewSet):
    queryset = Author.objects.all()
    serializer_class = AuthorSerializer
    filterset_class = AuthorFilterSet

Serializer

class AuthorSerializer(BaseSerializer):
    books = ResourceRelatedField(many=True, read_only=True)
    included_serializers = {
        "books": BookSerializer,
    }

    class Meta(BaseSerializer.Meta):
        model = Author

如果有人能给我指出正确的方向,我会很有帮助.

推荐答案

您的问题在序列化程序中.默认情况下,Django将使用Model._base_manager来获取相关对象,而不是自定义管理器.您需要在嵌套的ResourceRelatedField字段中指定要使用的管理器

class AuthorSerializer(BaseSerializer):
    books = ResourceRelatedField(
        queryset=Book.objects,
        many=True,
        read_only=True
    )
    ...

Django相关问答推荐

如何在Django模型mixin字段定义中引用模型名称?

如何将Django项目连接到容器化的PostgreSQL数据库?

如何在Django中显示文件大小

在Django ORM中引用非主外键

Django:创建一个动态侧边栏模板并在其他模板中使用它

来自 Django 应用程序的日志(log)消息未上传到 AWS CloudWatch

在 django HTML 邮箱模板中使用字体

data._mutable= 在 Django REST 框架中为真

在用例图中建模前端和后端

遍历django模板中的外键相关表

Django 表单有 Select 但也有自由文本选项?

如何在 Django 中创建一个独特的 slug

Django REST 异常

如何在终端中切换 Python 版本?

Django聚合:仅求和返回值?

刷新时重新提交的django表单

在 django admin 中控制 TextArea 小部件的大小

在 Django 单元测试中使用 mock 修补 celery 任务

Django:如何从模板中识别调用视图?

Python Django 的多线程