1

我有一个带有 OneToOneField(线程)的模型(预订),该模型随后具有外键关系(消息)。我想在 Booking 管理员上显示消息列表,但是在中间的 Thread 模型中,这似乎很难/不可能?

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, ]

如果这是最好的方式,我很乐意覆盖内联的工作方式,但我不确定在哪里解决这个问题。看起来覆盖 *get_formset* 可以解决问题?

4

1 回答 1

0

这还没有完全测试,但似乎工作。解决方案是有一个带有钩子的内联和表单集,以用附加的线程替换预订......

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)
于 2012-07-07T04:15:31.803 回答