1

我的一个模型包含一个具有数千个实例的模型的 ForeignKey 字段。
当我显示一条记录时,所有这些都加载到一个下拉列表中,我 a) 不需要并且 b) 速度很慢,尤其是在一页上显示多条记录时。
由于下拉菜单的大小,页面大小高达 3.5mb 的倍数。

我考虑过使用“limit_choices_to”来包含它,但是

country = models.IntegerField(blank=True, null=True)
location = models.ForeignKey(Geonames, limit_choices_to = {'cowcode': country}, related_name='events')

不起作用。有没有办法做到这一点?

更新:
我想显示什么?
我想显示上面代码的来源中的所有地方( Geonames) 。我只想显示这些地方,不是所有可能的地方的完整列表。countryEventRecord

为什么我不需要所有地方?
a) 页面加载时间:页面加载时间为 3.5 分钟有点太长
b) 见上文:事件发生在某个国家/地区,因此我不需要显示不在该国家/地区的位置

4

3 回答 3

4

您想要的是limit_choices_to了解您的实例,这是不可能的。您应该做的是在管理表单中设置字段的queryset属性location,类似于以下内容:

class EventRecordAdminForm(forms.ModelForm):

    class Meta:
        model = EventRecord

    def __init__(self, *args, **kwargs):
        super(EventRecordAdminForm, self).__init__(*args, **kwargs)
        self.fields['location'].queryset = Geonames.objects.filter(cowcode=self.instance.country)

当然,为您的管理员使用该表格:

class EventRecordAdmin(admin.ModelAdmin):

    form = EventRecordAdminForm

有关文档,请参见此处

于 2014-10-01T09:18:48.937 回答
2

如果您使用的是管理界面,您可以在 ModelAdmin 中使用 raw_id_fields:

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'publisher', 'publication_date')
    list_filter = ('publication_date',)
    date_hierarchy = 'publication_date'
    ordering = ('-publication_date',)
    filter_horizontal = ('authors',)
    raw_id_fields = ('publisher',)

来自 Django 书:

有时您不想承担必须选择所有相关对象以显示在下拉列表中的开销。例如,如果我们的图书数据库增长到包含数千个出版商,“添加图书”表单可能需要一段时间才能加载,因为它必须加载每个出版商才能在框中显示。

解决此问题的方法是使用名为 raw_id_fields 的选项。将此设置为 ForeignKey 字段名称的元组,这些字段将显示在管理员中,并带有一个简单的文本输入框 () 而不是选择。

于 2013-08-12T10:33:38.140 回答
0

不知道为什么这对你不起作用。但我认为更好的解决方案是使用django-smart-selects. 这样你就可以让用户先选择国家。然后只有当用户第一次选择国家时才会填充 Geoname 下拉列表。

从文档:

如果您有以下型号:

class Location(models.Model)
    continent = models.ForeignKey(Continent)
    country = models.ForeignKey(Country)
    area = models.ForeignKey(Area)
    city = models.CharField(max_length=50)
    street = models.CharField(max_length=100)

如果您选择一个大陆,您希望只有位于该大陆的国家/地区可用,并且您可以执行以下操作的区域相同:

from smart_selects.db_fields import ChainedForeignKey 

class Location(models.Model)
    continent = models.ForeignKey(Continent)
    country = ChainedForeignKey(
        Country, 
        chained_field="continent",
        chained_model_field="continent", 
        show_all=False, 
        auto_choose=True
    )
    area = ChainedForeignKey(Area, chained_field="country", chained_model_field="country")
    city = models.CharField(max_length=50)
    street = models.CharField(max_length=100)

此示例假设 Country 模型有一个continent = ForeignKey(Continent) 字段,而 Area 模型有 country = ForeignKey(Country) 字段。

于 2013-08-12T11:31:30.993 回答