我是django的新手,我必须使用它开发REST API。我在mysql db上有数据,我想按需更新其中之一。我使用PyMySQL,每个数据都有5个字段(petId,名称,种类,性别,生日)。例如,网址可以是
... / api / pets / 3 / update?name =蓬松,年龄= 4
或
... / api / pets / 3 / update?age = 5
或
... / api / pets / 3 / update?age = 2,gender = f,name =蓬松
在每种情况下,这应该使用给定参数更新ID为3的宠物。如您所见,参数的位置和数量可以变化。
在我的 views.py 中,我有这种方法
def update_a_pet(requested_pet_id, **data):
pet = get_a_pet(requested_pet_id)
pet_id = data.get('petId', pet[petId])
pet_name = data.get('name', pet[name])
pet_species = data.get('species', pet[species])
pet_gender = data.get('gender', pet[gender])
pet_birthday = data.get('birthday', pet[birthday])
try:
with create_connection().cursor() as cursor:
sql = "UPDATE `%s` SET `%s` = `%d`, `%s` = `%s`, `%s` = `%s`, `%s` = `%s`, `%s` = `%s` WHERE `%s` = `%d`"
cursor.execute(sql, (table_name, petId, pet_id, name, pet_name, species, pet_species, gender, pet_gender,
birthday, pet_birthday, petId, requested_pet_id))
create_connection().commit()
我计划使用具有request_pet_id变量的ID和所有其他参数作为** data来获取ID。
在 urls.py 中,我有以下几行内容可以完成此任务。但是我无法弄清楚如何传递不同数量和类型的参数。
url('api/pets/(?P<requested_pet_id>[0-9]+)/update/$', views.update_a_pet),
到目前为止,这是我能想到的。如果可能有更好的方法,我也会提出建议。谢谢。
答案 0 :(得分:0)
开始的方式是使用“查询字符串”,而不是url参数。 REST用于稳定的URL;您生成的query_strings是动态的并且更合适。要从查询字符串获取值,请使用request.GET.getlist()。但是...
更传统的Django方法是使用html表单并将数据回传。 POST保证POST的所有内容都可以到达服务器,而GET则不能,因此,如果要将值放入数据库中,则确实应该使用POST。在Django中,数据位于request.POST ['fieldname']中。视图函数希望接收“请求”对象以及URL中捕获的所有参数。
Django在models.py中的ORM将使您几乎可以在Python中执行任何SQL-在这种情况下,您将在models.py中使用models.CharField和models.DateField类型定义了pets。然后更新宠物:
pet = Pets.objects.get(pk=petpk) # identify an existing row to update by pk in URL or POST
pet.gender = request.POST['gender']
pet.birthday = request.POST['birthday']
pet.save() # generates the SQL and writes it back in a single database action.
Django还具有一个“表单”模块,该模块提供了一些快捷方式/替代方法,可以在html中手动定义表单并正确命名字段。制作一个PetForm(ModelForm),整个项目变得更加简单。