Nano Hash - криптовалюты, майнинг, программирование

Django - Ограничить поле выбора набором запросов внешней таблицы?

У меня есть две модели следующим образом:

System_Contact
    first_name
    last_name
    isOwner = CharField ('Y'/'N')
    isMainContact = CharField ('Y'/'N')

System
    mainContact = ForeignKey(System_Contact)
    owner = ForeignKey(System_Contact)
    billTo = ForeignKey(System_Contact)

Итак, когда я показываю форму System на веб-странице, пользователь может выбрать контакты mainContact, owner и billTo из раскрывающегося меню, чтобы сохранить их в модели System. Однако я хочу отфильтровать поля выбора в форме System, чтобы они были такими:

mainContact Select box: -- only show System_Contacts that have isMainContact = 'Y'
owner Select Box: -- only show Syste_Contacts that have isOwner = 'Y'

Как и сейчас, я знаю, как ограничить поле выбора, отфильтровав набор запросов, но я не знаю, как отфильтровать связанный набор запросов внешнего ключа. Поскольку поля mainContact и owner являются внешними ключами, мне нужно отфильтровать внешнюю таблицу (System_Contact), а не таблицу, на которой построена форма (System)

Я знаю, как отфильтровать обычное поле выбора без внешнего ключа следующим образом:

form.fields["some_field"].queryset = Some_Model.objects.filter(some_field="Foo")

Как мне «расширить» это, чтобы фильтровать внешнюю таблицу?

Это то, что я пытаюсь сейчас, но безуспешно:

form.fields["mainContact"].queryset = System_Contact.objects.filter(isMainContact = 'Y')

Спасибо


Ответы:


1

Это то, что я пытаюсь сейчас, но безуспешно:

form.fields["mainContact"].queryset = System_Contact.objects.filter(isMainContact = 'Y')

Можете ли вы включить форму вашей модели и представление? Это выглядит нормально для меня.

Другой подход состоит в том, чтобы переопределить метод __init__ формы вашей модели и установить там набор запросов.

class SystemForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(SystemForm, self).__init__(*args, **kwargs)
        self.fields["mainContact"].queryset = System_Contact.objects.filter(isMainContact = 'Y')
    class Meta:
        model = System

Кроме того, я бы рекомендовал использовать BooleanField вместо a CharField с вариантами выбора «Y» и «N».

27.09.2011

2

Этот синтаксис выглядит правильно. Вы получаете сообщение об ошибке или просто не фильтруете и не показываете всех? Попробуйте System_Contact.objects.get(id=<some valid id>), чтобы увидеть, получает ли он только один или несколько. Если он получает больше, возможно, он заполняется из другого вызова, чем тот, который предполагался.

27.09.2011

3

Ну, это неудобно...

Когда я вставлял форму представления и модели в соответствии с запросом Alasdair's, я заметил свою ошибку. Вот моя (неверная) точка зрения:

def system_contacts(request, systemID):
    sys = System.objects.get(pk=systemID)
    if request.method == 'POST':
        form = System_Contacts_Form(request.POST, instance=sys)
        form.fields["systemOwner"].queryset = System_Contact.objects.filter(systemOwner__exact='Y')
        form.fields["mainContact"].queryset = System_Contact.objects.filter(isMainContact__exact = 'Y')
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/systems/')
    else:
        conts = Contact_List.objects.filter(systemID = sys.pk)
        form = System_Contacts_Form(instance=sys)
    return render_to_response('pages/systems/system_pages/contacts.html', {'sys':sys, 'form':form, 'conts':conts}, context_instance=RequestContext(request))

Я поместил часть form.fields["systemOwner"]... в раздел POST вида, а не в раздел GET вида.

Вот мой исправленный вид:

def system_contacts(request, systemID):
    sys = System.objects.get(pk=systemID)
    if request.method == 'POST':
        form = System_Contacts_Form(request.POST, instance=sys)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/systems/')
    else:
        conts = Contact_List.objects.filter(systemID = sys.pk)
        form = System_Contacts_Form(instance=sys)
        form.fields["systemOwner"].queryset = System_Contact.objects.filter(systemOwner__exact='Y')
        form.fields["mainContact"].queryset = System_Contact.objects.filter(isMainContact__exact = 'Y')
    return render_to_response('pages/systems/system_pages/contacts.html', {'sys':sys, 'form':form, 'conts':conts}, context_instance=RequestContext(request))

Теперь мой исправленный вид работает, и фильтрация работает на входах select в форме. Я бы и не подумал смотреть на это без вашей помощи.

Ваше здоровье :-)

28.09.2011
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..