django-通过URL

时间:2018-08-19 22:50:12

标签: django rest api

我是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),

到目前为止,这是我能想到的。如果可能有更好的方法,我也会提出建议。谢谢。

1 个答案:

答案 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),整个项目变得更加简单。