Форум сайта python.su
Предположим у нас есть страна, в ней города, есть ещё компании, компания может работать только в одной стране, у компании есть офисы располагающиеся в городах, причём в одном городе у компании может быть только один офис. Т.е. получаем такую модель:
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"),)
Отредактировано (Сен. 10, 2010 13:47:20)
Офлайн
Пришёл пока к такому решению:
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)
Офлайн
В общем остановился на такой реализации:
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
Офлайн
Работает? так не парься, тебе же не в гугол на собеседование с этим кодом итти. Да?
Или читай по рефакторинг.
Офлайн
Работать, то работает, но решение кривовато, а значит в похожей ситуации в следующий раз я опять буду использовать его, что не есть гуд, поэтому и хотелось бы найти более изящное и правильное решение.
А насчёт рефакторинга не понял… Это где тут можно его провести?
Офлайн
Офлайн