Django: limit_choices_to (это правильно)
Правильно ли это?
class Customer(models.Model):
account = models.ForeignKey(Account)
class Order(models.Model):
account = models.ForeignKey(Account)
customer = models.ForeignKey(Customer, limit_choices_to={'account': 'self.account'})
Я пытаюсь убедиться, что в форме заказа будут отображаться только варианты клиентов, принадлежащие той же учетной записи, что и Заказ.
Если я пропущу какую-то вопиющую ошибку плохого дизайна, дайте мне знать.
Главное, что меня интересует:
limit_choices_to={'account': 'self.account'}
Ответы
Ответ 1
Единственный ответ на вопрос "правильно ли это": "работает ли он, когда вы его запускаете?" Ответ на это, конечно, нет, поэтому я не знаю, почему вы спрашиваете здесь.
Нет возможности использовать limit_choices_to для динамического ограничения на основе значения другого поля в текущей модели. Лучший способ сделать это - настроить форму. Определите подкласс ModelForm и переопределите метод __init__
:
class MyOrderForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyOrderForm, self).__init__(*args, **kwargs)
if 'initial' in kwargs:
self.fields['customer'].queryset = Customer.objects.filter(account=initial.account)
Ответ 2
В конструкторе вы должны установить поле choices
вашей формы заказа (унаследовано от ModelForm
).
Ответ 3
limit_choices_to={'account': 'self.account'}
неверно, поскольку внешний ключ для клиента не может указывать на Account
.