防止Django管理面板在多个关系的内联显示中显示下拉列表

防止Django管理面板在多个关系的内联显示中显示下拉列表,django,django-admin,Django,Django Admin,我在Django 1.5中有一个自参考模型,如下所示: RELATIONSHIP_PARENT = 1 RELATIONSHIP_BLOCKED = 2 RELATIONSHIP_STATUSES = ( (RELATIONSHIP_PARENT, 'Parent'), (RELATIONSHIP_BLOCKED, 'Blocked'), ) class Message(models.Model): content = models.CharField("Conten

我在Django 1.5中有一个自参考模型,如下所示:

RELATIONSHIP_PARENT = 1
RELATIONSHIP_BLOCKED = 2
RELATIONSHIP_STATUSES = (
    (RELATIONSHIP_PARENT, 'Parent'),
    (RELATIONSHIP_BLOCKED, 'Blocked'),
) 

class Message(models.Model):
    content = models.CharField("Content", max_length=160, db_index=True)
    relationships = models.ManyToManyField('self',
        through='Relationship',
        symmetrical=False,
        related_name='related_to')

class Relationship(models.Model):
    parent_message = models.ForeignKey(Message, related_name='parent_messages')
    child_message = models.ForeignKey(Message, related_name='child_messages')
    status = models.IntegerField(choices=RELATIONSHIP_STATUSES)
我将Django admin配置为在查看单个
消息
面板时以内联方式显示
关系,如下所示:

from django.contrib import admin
from demo.models import Message, Relationship

class RelationshipInline(admin.TabularInline):
    model = Relationship
    extra = 0
    fk_name = 'parent_message'

class MessageAdmin(admin.ModelAdmin):
    inlines = (RelationshipInline,)

admin.site.register(Message, MessageAdmin)
admin.site.register(Relationship)
我打算在表中存储许多消息(其中有许多父子连接)。每当我通过管理面板查看个人消息时,我都会看到如下内容:

如红色圆圈所示,Django admin收集数据库中的所有消息,并将它们显示为菜单中的下拉列表。我已经通读了一些防止它的方法,我找到的最接近的方法是,当我尝试将
raw\u id\u fields=('parent\u message',)
放在
RelationshipInline
类下时,它似乎什么都没做

如果有人可以向我推荐一个链接或资源,或者只是告诉我如何防止Django显示下拉列表中的每个条目/消息,我将非常感谢您的帮助。谢谢。

这应该行得通

class RelationshipFormSet(BaseInlineFormSet):
    def get_queryset(self):
        if not hasattr(self, '_queryset'):
            criteria = {} #Your criteria here
            qs = super(RelationshipFormSet, self).get_queryset().filter(**criteria)
            self._queryset = qs
        return self._queryset

class RelationshipInline(admin.TabularInline):
    model = Relationship
    extra = 0
    fk_name = 'parent_message'
    formset =  RelationshipFormSet
这应该行得通

class RelationshipFormSet(BaseInlineFormSet):
    def get_queryset(self):
        if not hasattr(self, '_queryset'):
            criteria = {} #Your criteria here
            qs = super(RelationshipFormSet, self).get_queryset().filter(**criteria)
            self._queryset = qs
        return self._queryset

class RelationshipInline(admin.TabularInline):
    model = Relationship
    extra = 0
    fk_name = 'parent_message'
    formset =  RelationshipFormSet

raw\u id\u字段应位于admin类中:

admin.py

class MessageAdmin(admin.ModelAdmin):
inlines=(RelationshipInline,)
原始\u id\u字段=('parent\u message',)

原始id\u字段应放在admin类中:

admin.py

class MessageAdmin(admin.ModelAdmin):
inlines=(RelationshipInline,)
原始\u id\u字段=('parent\u message',)

谢谢。这是一个非常详细和直接的回答。但是由于我是一个新手,我想问一下我应该在
{}
中添加什么。这是Python代码片段(类似于函数式语言风格)?如果是这样,除了当前设置的消息(在上面的图片中,它是
消息2
),我应该写些什么来阻止其他一切(消息)?
raw\u id\u字段
是选项吗?我理解这可能是不负责任的,可能是太多的要求;我只是问,因为我不知道发生了什么。再次感谢。:)标准可以是这样的:
name\uu startswith='a'
或其他东西。它们是在任何queryset筛选器中使用的常规筛选器条件。我相信在这种方法中您不需要
原始id\u字段
。明白!非常感谢您花时间和耐心回答。:)另外,如果您不介意的话,请您快速检查这个[问题]()并确认现有答案是否准确?谢谢你@karthikr。谢谢你,@karthikr。在我确认它是正确答案之前,我想先和你确认一下。祝你周末愉快。:)非常感谢。这是一个非常详细和直接的回答。但是由于我是一个新手,我想问一下我应该在
{}
中添加什么。这是Python代码片段(类似于函数式语言风格)?如果是这样,除了当前设置的消息(在上面的图片中,它是
消息2
),我应该写些什么来阻止其他一切(消息)?
raw\u id\u字段
是选项吗?我理解这可能是不负责任的,可能是太多的要求;我只是问,因为我不知道发生了什么。再次感谢。:)标准可以是这样的:
name\uu startswith='a'
或其他东西。它们是在任何queryset筛选器中使用的常规筛选器条件。我相信在这种方法中您不需要
原始id\u字段
。明白!非常感谢您花时间和耐心回答。:)另外,如果您不介意的话,请您快速检查这个[问题]()并确认现有答案是否准确?谢谢你@karthikr。谢谢你,@karthikr。在我确认它是正确答案之前,我想先和你确认一下。祝你周末愉快。:)