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

Django中如何在一个Model的多个字段复用外键关联同一Model?

问题:Django中如何给Trip模型添加多个指向同一Hotel模型的外键字段?

我想要构建Trip.Model,将同一个Hotel.Model分别分配到不同的字段名下(示例:_pb、_hv、_nl),尝试的代码如下:

class Trip(models.Model):
    hotel_pb = models.ForeignKey(Hotel, on_delete=models.PROTECT, blank=True)
    hotel_hv = models.ForeignKey(Hotel, on_delete=models.PROTECT, blank=True)
    hotel_nl = models.ForeignKey(Hotel, on_delete=models.PROTECT, blank=True)

但直接运行出现了反向访问器冲突的错误,提示内容如下:

反向访问器 'Activity.trip_set' 与 'gobasic.Trip.acitivity_3' 的反向访问器冲突。提示:请为 'gobasic.Trip.acitivity_3' 或 'gobasic.Trip.acitivity_1' 的定义添加或修改 related_name 参数。

请问如何在不创建多个Hotel.Model的前提下实现该需求?


解决方法

错误根源是:Django默认会为每个外键生成名为xxx_set的反向访问器,当多个外键指向同一模型时,这些默认名称重复,导致冲突。

只需给每个ForeignKey字段指定唯一的related_name参数,让Django为每个字段生成不同的反向访问器名称即可。修改后的代码示例:

class Trip(models.Model):
    hotel_pb = models.ForeignKey(Hotel, on_delete=models.PROTECT, blank=True, related_name='trip_hotel_pb')
    hotel_hv = models.ForeignKey(Hotel, on_delete=models.PROTECT, blank=True, related_name='trip_hotel_hv')
    hotel_nl = models.ForeignKey(Hotel, on_delete=models.PROTECT, blank=True, related_name='trip_hotel_nl')

也可以用占位符自动生成唯一名称,省去手动命名的麻烦:

class Trip(models.Model):
    hotel_pb = models.ForeignKey(Hotel, on_delete=models.PROTECT, blank=True, related_name='%(class)s_%(field)s')
    hotel_hv = models.ForeignKey(Hotel, on_delete=models.PROTECT, blank=True, related_name='%(class)s_%(field)s')
    hotel_nl = models.ForeignKey(Hotel, on_delete=models.PROTECT, blank=True, related_name='%(class)s_%(field)s')

这样每个字段的反向访问器会自动生成为Trip_hotel_pb、Trip_hotel_hv、Trip_hotel_nl,既保证唯一性又简洁高效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:01:12