我在Django中有一个业务模型,需要从API插入信息。但是,我想避免数据库中的重复项。因此,每当用户单击特定的业务链接时,我需要检查它是否已经存在于数据库中,如果不存在,则必须将其插入数据库并查看结果。到目前为止,下面的代码是我所做的。
def checkBusiness(request, business):
try:
result = Business.objects.get(checkId=business.checkId)
except Business.DoesNotExist:
b = Business(name=business[0]['name'], street_address=business[0]['location']['address'], city=business[0]['location']['city'], state=business[0]['location']['state'], country=business[0]['location']['country'], category=business[0]['categories']['name'], distance=business[0]['location']['distance'], checkId=business[0]['id'])
b.save()
result = Business.objects.get(checkId=checkId)
context = {
'business': result,
}
return render(request, "MyDiary/checkBusiness.html", context)
这是我的路由的样子:
path('checkBusiness', views.checkBusiness, name='checkBusiness'),
这是我的html:
{% for business in businesses %}
<li>
/*business is a json file for specific business detail*/
<a href="{% url 'checkBusiness' business %}" > {{ business.name }}, {{ business.location.address }}, {{ business.location.postalCode }} </a>
</li>
{% endfor %}
答案 0 :(得分:2)
您不能在URL中传递对象。您应该了解,{% url something %}
只是在创建一个URL,即您在浏览器地址栏中看到的URL(准确地说是 path 部分)。网址路径不包含对象,它只是由/
分隔的多个路径段,例如/businesses/
或/businesses/49
或businesses/49/employees/
。
URL的 path 后可能包含查询字符串,该字符串是?
之后的键/值的列表,例如/businesses/?type=industrial&size=500
。在响应URL /businesses/
的Django视图中,您将看到request.GET
将具有键/值对{"type": "industrial", "size": 500}
。要在模板中构造这样的URL,您只需将参数附加到URL字符串:
"{% url 'business_list' %}?type={{ business.type }}&size={{ business.size }}"
urls.py只是路径的列表,它没有考虑查询字符串。如果您有路径/businesses/
的视图,则它将接受任何查询字符串(同样位于request.GET
中)。
但是您应该从不永远不要在GET请求上写入数据库,因此传递这样的参数来在数据库中创建新记录是很重要的事情。
您应该使用方法POST创建一个<form method="post">
,该方法将信息提交到您的视图(在request.POST
中),并且在验证后,您的视图将在数据库中创建记录。它还可以检查记录是否已经存在。
(请注意,仅使用checkId
进行检查无济于事,因为任何人都可以轻松更改ID,以便同一业务仍可以在您的数据库中重复,只是使用不同的ID。 )