1

Предположим, что у меня есть Лицо, которое управляет системой инвентаризации. У каждого человека есть несколько автомобилей, и у каждого автомобиля есть очень много частей (тысячи, скажем так).Django: многозначные поля и целостность данных

Лицо, Боб, использует форму Django для создания автомобиля. Теперь Боб идет создавать некоторые части. Только на уровне формы Django знает, что части принадлежат определенному автомобилю, и что в поле Parts.ForeignKey (Car) должен быть только определенный автомобиль в качестве выбора. При создании Части вы должны столкнуться с конструктором формы или аналогичным, чтобы ограничить выбор автомобилей только автомобилями, принадлежащими Бобу.

Совершенно очевидно, что это право собственности на уровне формы не является надлежащим или безопасным. Во-первых, кажется, что автомобили других пользователей должны быть недоступны никому, кроме владельца автомобиля; в настоящее время только программирование на твердой форме не позволяет кому-либо просматривать любые другие автомобили Person's! Во-вторых, кажется, небрежно позаботиться о проблеме, модифицируя конструкторы таким образом. Что вы все думаете об этом, и есть ли способ добиться этого?

ответ

1

Прежде всего часть этого должна произойти на уровне, где вы знаете, кто является текущим пользователем. В Django theres нет ничего общего с global request.user, поэтому вам нужно проверить это, если у вас есть объект запроса или передать его как пареметр.

Один из способов добиться того, что вы просите, - использовать пользовательский менеджер. Для класса автомобиля можно использовать

class CarManager(models.Manager): 
    def for_user(self, user): 
     return super(CarManager, self).get_query_set().filter(creator=user) 

Вы также можете переопределить менеджер по умолчанию, и это стандартные методы, чтобы только этот метод.

Для второй части вам не нужно изменять конструктор, есть ли другие способы, если вам это не нравится. Но, модифицируя их, вы, например, не можете создать форму без зарегистрированного пользователя. Другой способ заключается в использовании ModelChoiceField и переопределить это QuerySet атр в представлении:

form.car.queryset = Car.objects.for_user(request.user) 

но такой подход к ошибкам. Вы должны установить модификатор конструктора формы следующим образом:

class PartForm(forms.ModelForm): 
    def __init__(self,user,*args,**kwargs): 
     super (PartForm,self).__init__(*args,**kwargs) 
     self.fields['car'].queryset = Car.objects.for_user(user) 

Надеюсь, что это поможет.

Смежные вопросы