Django中的FK验证

时间:2013-03-11 16:13:02

标签: django django-models django-orm

下午好,

我的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,如果它们确实存在于数据库中,我应该在调用此创建之前进行检查吗?这是两个额外的查询...但如果他们可以避免任何问题,我不介意!

非常感谢!

2 个答案:

答案 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请求并不困难。 始终清理并验证正在添加到系统中的外部数据。