下午好,
我的django服务器在顶部运行REST api来为我的移动设备提供服务。现在,在某些时候,移动设备将与Django通信。
假设设备要求Django在数据库中添加一个对象,并且在该对象中,我需要像这样设置一个FK:
objectA = ObjectA.objects.create(title=title,
category_id = c_id, order = order, equipment_id = e_id,
info_maintenance = info_m, info_security = info_s,
info_general = info_g, alphabetical_notation = alphabetical_notation,
allow_comments = allow_comments,
added_by_id = user_id,
last_modified_by_id = user_id)
如果从我的移动设备收到e_id和c_id,如果它们确实存在于数据库中,我应该在调用此创建之前进行检查吗?这是两个额外的查询...但如果他们可以避免任何问题,我不介意!
非常感谢!
答案 0 :(得分:1)
它认为Django默认情况下会对外键创建约束(尽管可能依赖于数据库)。这意味着如果您的外键指向不存在的内容,则保存将失败(导致Python端出现异常)。
答案 1 :(得分:0)
您可以将其缩减为单个查询(至少应为单个查询,警告我尚未测试代码):
if MyObject.objects.filter(id__in=[e_id, c_id]).distinct().count() == 2:
# create the object
ObjectA.objects.create(...)
else:
# objects corresponding e_id and c_id do not exist, do NOT create ObjectA
您应始终验证来自用户或可由确定用户更改的任何信息。有人嗅探流量并开始构建自己的服务器REST请求并不困难。 始终清理并验证正在添加到系统中的外部数据。