如何让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
相关产品推荐
相关产品推荐

