Django反向访问器冲突:设置related_name后问题仍未解决
解决Django模型'reverse accessor'冲突问题
你的冲突根源是两个ManyToManyField都指向User模型,但未指定唯一的related_name,导致Django为User自动生成的反向访问器名称重复,引发冲突。你之前只给ForeignKey设置了related_name,但忽略了ManyToManyField的配置。
修复步骤:
- 给两个
ManyToManyField分别设置唯一的related_name,确保User模型上的反向访问器名称不重复 - 可选:修正拼写错误(
reciever→receiver,避免后续维护混淆)
修正后的代码:
class TradeOffersManager(models.Manager): def create_trade_offer(self, sender, receiver, sending_item, receiving_item): trade_offer = self.create(sending_item=sending_item, receiving_item=receiving_item) trade_offer.sender.set(sender) trade_offer.receiver.set(receiver) return trade_offer class TradeOffers(models.Model): sender = models.ManyToManyField(User, related_name="sent_trade_offers") sending_item = models.ForeignKey(TradePost, on_delete=models.CASCADE, related_name="sending_item_trades") receiver = models.ManyToManyField(User, related_name="received_trade_offers") receiving_item = models.ForeignKey(TradePost, on_delete=models.CASCADE, related_name="receiving_item_trades") objects = TradeOffersManager()
为什么之前的方法无效?
你尝试的'%(app_label)s_%(class)s_related'是通用命名模板,但如果直接给两个相同类型的字段用一样的模板,生成的名称还是会重复(比如两个字段都会生成yourapp_tradeoffers_related)。必须为每个指向同一模型的关联字段设置唯一的related_name值。
额外说明:
设置related_name后,你就可以通过User实例反向访问关联的交易记录:
- 获取用户发起的所有交易:
user.sent_trade_offers.all() - 获取用户收到的所有交易:
user.received_trade_offers.all()
内容的提问来源于stack exchange,提问作者KR03
相关产品推荐
相关产品推荐

