【问题标题】:django - Passing varying values through URLdjango - 通过 URL 传递不同的值
【发布时间】:2018-08-19 22:50:12
【问题描述】:

我是 django 的新手,我必须用它开发一个 REST API。我在 mysql db 上有数据,我想根据需要更新其中一个。我使用 PyMySQL,每个数据有 5 个字段(petId、name、species、gender、birthday)。例如,url 可以是

.../api/pets/3/update?name=fluffy,age=4

.../api/pets/3/update?age=5

.../api/pets/3/update?age=2,gender=f,name=fluffy

在每种情况下,这都应该使用给定的参数更新 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()

我打算用 requested_pet_id 变量和所有其他参数作为 **data 获取 id。

urls.py 我有下面这行来完成这个任务。但我不知道如何传递不同数量和类型的参数。

url('api/pets/(?P<requested_pet_id>[0-9]+)/update/$', views.update_a_pet),

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

【问题讨论】:

    标签: django rest api


    【解决方案1】:

    您开始的方式是使用“查询字符串”,而不是 url 参数。 REST 用于稳定的 url;您生成的 query_strings 是动态的并且更适合。要从查询字符串中获取值,请使用 request.GET.getlist() 例如。但是……

    更传统的 Django 方法是使用 html 表单并将数据 POST 回来。 POST 保证 POST 的所有内容都会到达服务器,而 GET 则不能,因此如果您将值放入数据库,您真的应该使用 POST。在 Django 中,数据位于 request.POST['fieldname'] 中。视图函数期望接收“请求”对象以及 URL 中捕获的任何参数。

    models.py 中的 Django 的 ORM 将让您在 Python 中执行几乎任何 sql - 在这种情况下,您将在 models.py 中使用 models.CharField 和 models.DateField 类型定义宠物。然后更新宠物:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      • 2011-05-25
      • 2016-05-30
      • 1970-01-01
      • 2015-12-04
      • 2011-02-16
      • 2018-09-06
      相关资源
      最近更新 更多