You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Django代理模型的关联关系返回对应代理模型实例

可以实现,以下是两种可行方案

默认情况下,ProxyAuthor.objects.get(pk=123).books 返回的是原模型 Book 的实例——因为反向关联是基于 Author 和 Book 之间的外键关系建立的,代理模型不会自动修改这种关联的返回类型。但你可以通过以下方式实现需求:

方案一:自定义属性覆盖反向关联

直接在 ProxyAuthor 类中添加属性,替换原有的反向关联逻辑,返回 ProxyBook 的查询集:

class ProxyAuthor(Author):
    class Meta:
        proxy = True

    @property
    def books(self):
        return ProxyBook.objects.filter(author=self)

这样调用 ProxyAuthor.objects.get(pk=123).books 时,就能得到 ProxyBook 类型的查询集。如果需要保留原反向管理器的方法(比如 add()、remove()),可以调整为返回带关联条件的自定义管理器:

from django.db.models.manager import Manager

class ProxyBookManager(Manager):
    def __init__(self, author):
        super().__init__()
        self.author = author

    def get_queryset(self):
        return super().get_queryset().filter(author=self.author)

class ProxyAuthor(Author):
    class Meta:
        proxy = True

    @property
    def books(self):
        return ProxyBookManager(self)

方案二:新增自定义方法

如果不想覆盖原有的 books 关联,可以专门新增一个方法返回 ProxyBook 实例:

class ProxyAuthor(Author):
    class Meta:
        proxy = True

    def proxy_books(self):
        return ProxyBook.objects.filter(author=self)

调用时使用 ProxyAuthor.objects.get(pk=123).proxy_books() 即可。

内容的提问来源于stack exchange,提问作者Daniel Quinn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 07:52:43