Я просто столкнулся ForeignKey.limit_choices_to в документах Django. Не уверенный все же, как это работает, но это могла бы просто быть правильная вещь здесь.
Обновление: ForeignKey.limit_choices_to позволяет определять или константу, вызываемое или объект Q ограничить допустимый выбор для ключа. Константа, очевидно, бесполезна здесь, так как она ничего не знает о включенных объектах.
Используя вызываемое (функциональный или метод класса или любой вызываемый объект) кажется более многообещающим. Однако проблема того, как получить доступ к необходимой информации от объекта HttpRequest, остается. Используя локальная память потока может быть решением.
2. Обновление: Вот то, что работало на меня:
я создал промежуточное программное обеспечение, как описано в ссылке выше. Это извлекает один или несколько аргументов от запроса, ПОЛУЧАЮТ часть, такую как "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,
},
)
выгода - то, что необходимо предоставить информацию для ограничения выбора через запрос. Я не вижу способ получить доступ "сам" здесь.
Попробуйте это (в Rails 2):
Project.all(:conditions => ['archived IS NULL OR archived = ?', false])
Это ограничение старых версий Rails, как описано здесь: https://rails.lighthouseapp.com/projects/ 8994 / Tickets / 1181-ar-find -roduction-null-when-it-should-be-is-null
@metasoarous
Попробуйте:
Project.all(:conditions => "archived IS NULL OR archived = 'F'")