2013-08-12 5 views
0

Одна из моих моделей содержит поле ForeignKey для модели с несколькими тысячами экземпляров.
Когда я показываю запись, все они загружаются в выпадающее меню, которое я не нуждаюсь и b) медленно, как frack, особенно при отображении нескольких записей на одной странице.
Размер страницы увеличивается до нескольких раз. Из-за размера выпадающего списка.limit_choices_to в DjangoAdmin

Я думал об использовании "limit_choices_to" содержит, но

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

не работает. Есть ли способ сделать это?

Обновление:
Что я хочу отображать?
Я хочу показать все места (Geonames), которые находятся в country из EventRecord, что указанный выше код взят из. Я хочу показать только эти места, а не весь список всех возможных мест.

Почему мне не нужны все места?
a) Время загрузки страницы: 3,5 минуты для загрузки страницы слишком длинное
b) См. Выше: Событие происходит в определенной стране, поэтому мне не нужно показывать местоположения, которые не находятся в этой стране

+0

Почему вам это не нужно? Что вы хотите отобразить? –

+0

Обновлен мой вопрос, спасибо! – LukasKawerau

ответ

2

, если вы используете интерфейс администратора вы можете использовать raw_id_fields в ModelAdmin:

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',) 

from Django Book:

иногда вы не хотите брать на себя нагрузку от того, чтобы выбрать все соответствующие объекты для отображения в выпадающего списка. Например, если наша книжная база данных будет включать тысячи издателей, форма «Добавить книгу» может занять некоторое время, потому что ей придется загружать каждый издатель для отображения в поле.

Способ исправить это, чтобы использовать параметр raw_id_fields. Установите это в кортеж имен полей ForeignKey, и эти поля будут отображаться в admin с помощью простого текстового поля ввода() вместо выбора.

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) 

Этот пример asumes, что страна модель имеет континент = ForeignKey (Continent) поле и что модель имеет площадь кор ntry = ForeignKey (Страна).

2

Вы хотите, чтобы 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 

См here for docs

HTH!

Смежные вопросы