Я только что натолкнулся на ForeignKey.limit_choices_to в документации Django.
Пока не уверен, как это работает, но, может быть, это правильно.
Обновление: ForeignKey.limit_choices_to позволяет указать константу, вызываемый объект или объект Q для ограничения допустимых вариантов выбора ключа. Очевидно, что константа здесь бесполезна, поскольку она ничего не знает о задействованных объектах.
Использование вызываемого (метод функции или класса или любой вызываемый объект) кажется более перспективным. Однако проблема доступа к необходимой информации из объекта HttpRequest остается. Использование локального хранилища потока может быть решением.
2. Обновление: Вот что у меня сработало:
Я создал промежуточное программное обеспечение, как описано в ссылке выше. Он извлекает один или несколько аргументов из части GET запроса, такой как «product = 1», и сохраняет эту информацию в локальных потоках.
Далее в модели есть метод класса, который считывает локальную переменную потока и возвращает список идентификаторов, чтобы ограничить выбор поля внешнего ключа.
@classmethod
def _product_list(cls):
"""
return a list containing the one product_id contained in the request URL,
or a query containing all valid product_ids if not id present in URL
used to limit the choice of foreign key object to those related to the current product
"""
id = threadlocals.get_current_product()
if id is not None:
return [id]
else:
return Product.objects.all().values('pk').query
Важно вернуть запрос, содержащий все возможные идентификаторы, если ни один не был выбран, чтобы нормальные страницы администратора работали нормально.
Поле внешнего ключа объявляется как:
product = models.ForeignKey(
Product,
limit_choices_to={
id__in=BaseModel._product_list,
},
)
Проблема в том, что вы должны предоставить информацию, чтобы ограничить выбор посредством запроса. Я не вижу способа получить доступ к «я» здесь.