A] Resumen:Usando obtener o introducir la funcionalidad de uno a muchos modelos de Django y modelforms
Usando obtener o introducir la funcionalidad de uno a muchos modelos de Django, la comprobación de si existe un registro o relación antes de añadir un nuevo uno.
B] Detalles:
1] tengo el siguiente país Django estructura del modelo (uno) a la Ciudad (muchos)
2] Estoy usando ModelForm para mostrar el formulario en la página HTML . Los formularios se pasan como valores de plantilla y los valores de plantilla se representan en la página html
3] Cuando entra la solicitud, el código extrae los datos del formulario de país y ciudad, verifica su validez y lo guarda.
C] Edición/artículo Necesito ayuda con:
1] Quiero usar la funcionalidad get_or_insert con mi país y la relación de la ciudad
2] Básicamente, quiero comprobar si existe un registro de país existente en la base de datos del país seleccionado por el usuario,
2.1] si el país existe, verifique si hay un registro de ciudad para el país seleccionado.
2.1.1] si existe el registro de la ciudad, estamos bien, no hay necesidad de añadir otro récord
2.1.2] si el registro de la ciudad no existe, crear el registro de la ciudad y asociar el país con es
2.2] si el país no existe, cree el registro del país, cree el registro de la ciudad y asocie el registro de la ciudad con el registro del país.
C] Código Extractos:
1] Modelos y formularios -
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] código que imprime el user_country_form forms--
y son user_city_form pasado del código python como valores de plantilla
__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] código HTML fragmento que muestra los valores de la plantilla de la página 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>
extracto 3] Código para guardar los datos -
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
Gracias por la lectura .
[editar # 1]
@ Torsten, después me dio un puntero a get_or_insert, entonces me encontré con Stackoverflow post (http://stackoverflow.com/questions/4812832/get-or-create-matching -key-y-user-python-app-engine) e implementado la funcionalidad nombre_tecla al usuario get_or_insert
código para guardar el registro se ve como sigue:
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())
Solicitud: por favor alguien puede hacer un código rápido revise y avíseme si estoy haciendo algo mal o haciendo s ¿Algunos errores de novato?
Todas las cosas que lista como preguntas son declaraciones. ¿Cuál es tu pregunta? ¿Qué problema tienes? –
Lo siento @Nick Johnson, por no ser claro. Cambié el nombre de la sección a "Problema/ítem con el que necesito ayuda", ya que la pregunta era muy detallada. – bhavesh