我有一个模型(预订),其中OneToOneField(线程)随后具有ForeignKey关系(消息)。我想在预订管理员上显示一个消息列表,但是介于两者之间的线程模型似乎很难/不可能?
Class Booking(Model):
...
thread = models.OneToOneField('user_messages.Thread', verbose_name='thread')
class Thread(Model):
...
class Message(Model):
thread = models.ForeignKey(Thread, related_name="messages")
有没有办法可以设置我的BookingAdmin,内联可以显示消息(跨越线程关系)?类似的东西:
class MessageInline(TabularInline):
model = Message
fk_name = '???'
class BookingAdmin(ModelAdmin):
inlines = [MessageInline, ]
如果这是最好的方式,我很乐意覆盖Inlines的工作方式,但我不知道在哪里解决这个问题。它看起来像覆盖* get_formset *可能会成功吗?
答案 0 :(得分:0)
这尚未完全测试,但似乎有效。解决方案是使用带有挂钩的内联和formset来替换预订的附加线程...
class BookingMessageFormset(BaseInlineFormSet):
'''Given a Booking instance, divert to its Thread'''
def __init__(self, *args, **kwargs):
if 'instance' in kwargs:
kwargs['instance'] = kwargs['instance'].thread
else:
raise Exception() # TODO Not sure if/when this happens
BaseInlineFormSet.__init__(self, *args, **kwargs)
class MessageInline(admin.TabularInline):
model = Message
formset = BookingMessageFormset
def __init__(self, parent_model, admin_site):
'''Override parent_model'''
super(MessageInline, self).__init__(Thread, admin_site)