Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Работа с формами созданными из моделей. [RSS Feed]

#1 Сен. 10, 2010 13:46:34

fth
От:
Зарегистрирован: 2010-07-26
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с формами созданными из моделей.

Предположим у нас есть страна, в ней города, есть ещё компании, компания может работать только в одной стране, у компании есть офисы располагающиеся в городах, причём в одном городе у компании может быть только один офис. Т.е. получаем такую модель:

class Country(Model):
name = CharField()

class City(Model):
country = ForeignKey(Country, related_name = 'cities')

class Company(Model):
country = ForeignKey(Country, related_name = 'companies')

class Office(Model):
company = ForeignKey(Company, related_name = 'offices')
city = ForeignKey(City, related_name = 'offices')

class Meta:
unique_together = (("company", "city"),)
Возможно ли указать модели, что офис компании может располагаться только в городах той страны которой принадлежит компания? (т.е. some_office.city могла принимать значения только из some_office.company.country.cities)
Задача состоит в написании формы для создания офиса, что бы в выпадающем списке были только города той страны в которой работает компания и в которых нет ещё офисов этой компании.
Как лучше это сделать? Передавать в ручную QuerySet или же это можно сделать культурнее через модель?



Отредактировано (Сен. 10, 2010 13:47:20)

Офлайн

#2 Сен. 10, 2010 23:52:08

fth
От:
Зарегистрирован: 2010-07-26
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с формами созданными из моделей.

Пришёл пока к такому решению:

class NewOfficeForm(ModelForm):
class Meta:
model = Office

def __init__(self, company, *args, **kwargs):
super(ModelForm, self).__init__(*args, **kwargs)
self.fields['city'].queryset = company.country.cities.all()
self.fields['city'].empty_label = None
Только вот не соображу как отфильтровать города в которых уже есть офис…



Отредактировано (Сен. 10, 2010 23:52:29)

Офлайн

#3 Сен. 16, 2010 10:30:15

fth
От:
Зарегистрирован: 2010-07-26
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с формами созданными из моделей.

В общем остановился на такой реализации:

class NewOfficeForm(ModelForm):
class Meta:
model = Office

def __init__(self, company, *args, **kwargs):
super(ModelForm, self).__init__(*args, **kwargs)
all_cities = company.country.cities.all()
buf = [x.id for x in all_cities if x not in [y.city for y in company.offices.all()]]
q_set = company.country.cities.none()
for q_id in buf:
q_set = q_set.__or__(all_cities.filter(id = q_id))
self.fields['city'].queryset = q_set
self.fields['city'].empty_label = None
Но на мой взгляд она достаточно крива, так что буду благодарен, если кто-нибудь укажет на более изящное решение.



Офлайн

#4 Сен. 17, 2010 21:44:08

romankrv
От:
Зарегистрирован: 2008-05-23
Сообщения: 513
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с формами созданными из моделей.

Работает? так не парься, тебе же не в гугол на собеседование с этим кодом итти. Да?
Или читай по рефакторинг.

Офлайн

#5 Сен. 18, 2010 09:44:25

fth
От:
Зарегистрирован: 2010-07-26
Сообщения: 105
Репутация: +  0  -
Профиль   Отправить e-mail  

Работа с формами созданными из моделей.

Работать, то работает, но решение кривовато, а значит в похожей ситуации в следующий раз я опять буду использовать его, что не есть гуд, поэтому и хотелось бы найти более изящное и правильное решение.
А насчёт рефакторинга не понял… Это где тут можно его провести?



Офлайн

#6 Сен. 19, 2010 19:05:16

romankrv
От:
Зарегистрирован: 2008-05-23
Сообщения: 513
Репутация: +  0  -
Профиль   Отправить e-mail  

Офлайн

  • Начало
  • » Django
  • » Работа с формами созданными из моделей.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version