A] Резюме:
Использование функций get или insert для одной-многих моделей django, проверка наличия записи или отношения перед добавлением новой.
B] Подробности:
1] У меня есть следующая модель структуры django от страны (один) до города (много)
2] Я использую ModelForm для отображения формы на html-странице. Формы передаются как значения шаблона, а затем значения шаблона отображаются на html-странице
3] При поступлении почтового запроса код извлекает данные формы страны и города, проверяет их действительность и сохраняет их.
C] Проблема / предмет, в котором мне нужна помощь:
1] Я хочу использовать функцию get_or_insert с отношениями между моей страной и городом
2] По сути, я хочу проверить, существует ли существующая запись о стране в базе данных для страны, выбранной пользователем,
2.1], если страна существует, проверьте, есть ли запись города для выбранной страны.
2.1.1], если запись о городе существует, мы хороши, нет необходимости добавлять еще одну запись
2.1.2], если запись о городе не существует, создайте запись о городе и свяжите с ней страну
2.2] если страны не существует, создайте запись о стране, создайте запись о городе и свяжите запись о городе с записью о стране.
C] Выдержки из кода:
1] Модели и формы -
class UserReportedCountry(db.Model):
country_name = db.StringProperty( required=True,
choices=['Afghanistan','Aring land Islands']
)
class UserReportedCity(db.Model):
country = db.ReferenceProperty(UserReportedCountry, collection_name='cities')
city_name = db.StringProperty(required=True)
class UserCountryForm(djangoforms.ModelForm):
class Meta:
model = UserReportedCountry
class UserCityForm(djangoforms.ModelForm):
class Meta:
model = UserReportedCity
exclude = ('country', )
2] код для печати бланков -
user_country_form и user_city_form передаются из кода Python в качестве значений шаблона
__TEMPLATE_USER_COUNTRY_FORM = 'user_country_form'
__TEMPLATE_USER_CITY_FORM = 'user_city_form'
def get(self):
template_values = {
self.__TEMPLATE_USER_COUNTRY_FORM: UserCountryForm(),
self.__TEMPLATE_USER_CITY_FORM: UserCityForm()
}
#rendering the html page and passing the template_values
self.response.out.write(template.render(self.__MAIN_HTML_PAGE, template_values))
3] Отрывок кода HTML, который отображает значения шаблона на html-странице
<div id="userDataForm">
<form method="POST" action="/UserReporting">
<table>
<!-- Printing the forms for users country, city -->
{{ user_country_form }}
{{ user_city_form }}
</table>
<input type="submit" name="submit" value= "submit">
</form>
</div>
3] Кодовая выдержка для сохранения данных -
def post(self):
self.store_user_data()
self.redirect('/')
#method to save users data in the models UserReportedCountry, UserReportedCity
def store_user_data(self):
#getting user's country and city
user_reported_country = UserCountryForm(self.request.POST)
user_reported_city = UserCityForm(self.request.POST)
if (user_reported_country.is_valid() and user_reported_city.is_valid()):
#save the country data
country_entity = user_reported_country.save()
#save the city data, and relate county with city
city_entity = user_reported_city.save(commit=False)
city_entity.country = country_entity
city_entity.put()
return
else:
return
Спасибо за чтение.
[Изменить # 1]
@ Торстен, сообщение дало мне указатель на get_or_insert, затем я наткнулся на сообщение StackOverflow (/2524210/poluchit-ili-sozdat-sootvetstvuyschii-klych-i-polzovatelya-python-app-engine) и реализовал функцию key_name для пользователя get_or_insert
Код для сохранения записи выглядит следующим образом:
def store_user_data(self):
#getting user's country and city
user_reported_country = UserCountryForm(self.request.POST)
user_reported_city = UserCityForm(self.request.POST)
if (user_reported_country.is_valid() and user_reported_city.is_valid()):
#save the country and city data
country_record = self.store_country_data()
city_record = self.store_city_data(country_record)
return
else:
return
def store_country_data(self):
user_reported_country_name = self.request.POST['country_name']
key_name = self.sanitize_key_name(user_reported_country_name)
country_entity = UserReportedCountry.get_or_insert(key_name, country_name = user_reported_country_name)
country_entity.put()
return country_entity
def store_city_data(self, country_record):
user_reported_city_name = self.request.POST['city_name']
key_name = self.sanitize_key_name("%s:%s" % (country_record.country_name, str(user_reported_city_name)) )
city_entity = UserReportedCity.get_or_insert(key_name,
city_name = user_reported_city_name,
country= country_record)
city_entity.put()
return city_entity
def sanitize_key_name(self,key_name):
return re.sub(r'\s', '', key_name.lower())
Запрос: Может кто-нибудь сделать краткий обзор кода и сообщить мне, если я делаю что-то не так или совершаю ошибки новичка?