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

