【问题标题】:FK validation within DjangoDjango 中的 FK 验证
【发布时间】:2013-02-26 21:52:34
【问题描述】:

下午好,

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

非常感谢!

【问题讨论】:

  • 对 REST API 的请求是什么样的?

标签: django django-models django-orm


【解决方案1】:

它认为 Django 默认会在外键上创建约束(尽管可能取决于数据库)。这意味着如果您的外键指向不存在的东西,那么保存将失败(导致 Python 端出现异常)。

【讨论】:

    【解决方案2】:

    您可以将其简化为单个查询(至少应该是单个查询,警告我尚未测试代码):

    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 请求到您的服务器并不难。 始终清理和验证添加到系统中的外部数据。

    【讨论】:

    • 我认为c_ide_id 指向不同表中的对象。至少命名表明(分别为category_idequipment_id)。数据库的约束正是为此而设计的。
    • @freakish 如果他们实际上是在询问是否应该通过 REST 验证来自外部来源的信息,那是他们的问题中最少的一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    相关资源
    最近更新 更多