Джанго: 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'}

person orokusaki    schedule 28.12.2009    source источник
comment
Не поняла твой вопрос. Не могли бы вы быть более ясным?   -  person Mayuresh    schedule 28.12.2009


Ответы (3)


Единственный ответ на вопрос «правильно ли это» — это «работает ли это, когда вы его запускаете?» Ответ на этот вопрос, конечно, нет, поэтому я не знаю, почему вы спрашиваете здесь.

Невозможно динамически использовать 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)
person Daniel Roseman    schedule 28.12.2009
comment
То, что это не сработало для меня, не означает, что это был неправильный подход. Я спросил, потому что на сайте Django нет четкой документации об этой функции, и я не был уверен, что мой синтаксис верен. - person orokusaki; 28.12.2009
comment
Это также хорошо, если вам нужно иметь объект запроса в классе MyOrderForm -› stackoverflow.com/a/6062628/758202 - person zzart; 07.03.2013
comment
Да, это не очень ясно в документах. Я предполагаю, что проблема в том, что limit_choices_to является параметром функции ForeignKey, и эта функция должна быть назначена члену класса. На этом уровне self ничего не значит. Чтобы это работало, Django должна иметь функцию фильтра, которая работает в __init__, а, насколько я знаю, у него ее нет. - person Marco Sulla; 16.11.2014

Вы должны установить поле choices формы заказа (унаследованное от ModelForm) в конструкторе.

person Antony Hatchkins    schedule 28.12.2009

limit_choices_to={'account': 'self.account'} неверно, так как внешний ключ для клиента не может указывать на Account.

person Mayuresh    schedule 28.12.2009
comment
Однако у клиента есть атрибут учетной записи. Тем не менее это так? - person orokusaki; 28.12.2009