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

Django反向访问器冲突:设置related_name后问题仍未解决

解决Django模型'reverse accessor'冲突问题

你的冲突根源是两个ManyToManyField都指向User模型,但未指定唯一的related_name,导致Django为User自动生成的反向访问器名称重复,引发冲突。你之前只给ForeignKey设置了related_name,但忽略了ManyToManyField的配置。

修复步骤:

  1. 给两个ManyToManyField分别设置唯一的related_name,确保User模型上的反向访问器名称不重复
  2. 可选:修正拼写错误(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 09:00:19